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
3 changes: 1 addition & 2 deletions bean/umc10th/.gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
HELP.md
.gradle
.gradle-user-home/
.gradle-user-home-2/
.gradle-user-home*/
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,30 @@

import com.example.umc10th.domain.member.dto.MemberReqDto;
import com.example.umc10th.domain.member.dto.MemberResDto;
import com.example.umc10th.domain.member.exception.code.MemberSuccessCode;
import com.example.umc10th.domain.member.service.MemberService;
import com.example.umc10th.global.apiPayload.ApiResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/members")
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
public class MemberController {

private final MemberService memberService;

@GetMapping("/{memberId}")
public ResponseEntity<MemberResDto.MemberInfo> getMember(@PathVariable Long memberId) {
return ResponseEntity.ok(memberService.getMember(memberId));
}
@PostMapping("/me")
public ResponseEntity<ApiResponse<MemberResDto.GetMyPageResponse>> getMyPage(
@Valid @RequestBody MemberReqDto.GetMyPageRequest request
) {
MemberResDto.GetMyPageResponse result = memberService.getMyPage(request.id());

@PostMapping
public ResponseEntity<MemberResDto.MemberInfo> createMember(@Valid @RequestBody MemberReqDto.Create request) {
return ResponseEntity.ok(memberService.createMember(request));
return ResponseEntity.ok(ApiResponse.of(MemberSuccessCode.GET_MY_PAGE_SUCCESS, result));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,14 @@ public static MemberResDto.MemberInfo toMemberInfo(Member member) {
member.getNickname()
);
}
}

public static MemberResDto.GetMyPageResponse toMyPageResponse(Member member, Integer point) {
return new MemberResDto.GetMyPageResponse(
member.getName(),
null,
null,
null,
point
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.example.umc10th.domain.member.enums.Gender;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.Size;
import java.time.LocalDate;

Expand All @@ -16,4 +17,9 @@ public record Create(
@NotBlank @Size(max = 20) String nickname
) {
}

public record GetMyPageRequest(
@NotNull @Positive Long id
) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,13 @@ public record MemberInfo(
String nickname
) {
}

public record GetMyPageResponse(
String name,
String profileUrl,
String email,
String phoneNumber,
Integer point
) {
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
package com.example.umc10th.domain.member.exception;

import com.example.umc10th.domain.member.exception.code.MemberErrorCode;
import lombok.Getter;

@Getter
public class MemberException extends RuntimeException {

private final MemberErrorCode errorCode;
import com.example.umc10th.global.apiPayload.exception.GeneralException;

public class MemberException extends GeneralException {
public MemberException(MemberErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
super(errorCode);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
package com.example.umc10th.domain.member.exception.code;

import com.example.umc10th.global.apiPayload.code.BaseErrorCode;
import com.example.umc10th.global.apiPayload.code.dto.ReasonDto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum MemberErrorCode {
MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "MEMBER404", "����ڸ� ã�� �� �����ϴ�.");
public enum MemberErrorCode implements BaseErrorCode {
MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "MEMBER404", "User not found.");

private final HttpStatus status;
private final HttpStatus httpStatus;
private final String code;
private final String message;

@Override
public ReasonDto getReason() {
return new ReasonDto(httpStatus, false, code, message);
}

@Override
public ReasonDto getReasonHttpStatus() {
return getReason();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.umc10th.domain.member.exception.code;

import com.example.umc10th.global.apiPayload.code.BaseSuccessCode;
import com.example.umc10th.global.apiPayload.code.dto.ReasonDto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum MemberSuccessCode implements BaseSuccessCode {
GET_MY_PAGE_SUCCESS(HttpStatus.OK, "MEMBER2001", "Successfully retrieved user information.");

private final HttpStatus httpStatus;
private final String code;
private final String message;

@Override
public ReasonDto getReason() {
return new ReasonDto(httpStatus, true, code, message);
}

@Override
public ReasonDto getReasonHttpStatus() {
return getReason();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ public interface MemberService {
MemberResDto.MemberInfo getMember(Long memberId);

MemberResDto.MemberInfo createMember(MemberReqDto.Create request);
}

MemberResDto.GetMyPageResponse getMyPage(Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import com.example.umc10th.domain.member.exception.MemberException;
import com.example.umc10th.domain.member.exception.code.MemberErrorCode;
import com.example.umc10th.domain.member.repository.MemberRepository;
import com.example.umc10th.domain.mission.enums.MemberMissionStatus;
import com.example.umc10th.domain.mission.repository.MemberMissionRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -17,6 +19,7 @@
public class MemberServiceImpl implements MemberService {

private final MemberRepository memberRepository;
private final MemberMissionRepository memberMissionRepository;

@Override
public MemberResDto.MemberInfo getMember(Long memberId) {
Expand All @@ -32,4 +35,17 @@ public MemberResDto.MemberInfo createMember(MemberReqDto.Create request) {
Member savedMember = memberRepository.save(MemberConverter.toEntity(request));
return MemberConverter.toMemberInfo(savedMember);
}
}

@Override
public MemberResDto.GetMyPageResponse getMyPage(Long memberId) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new MemberException(MemberErrorCode.MEMBER_NOT_FOUND));

Integer totalPoint = memberMissionRepository.sumRewardPointByMemberIdAndStatus(
memberId,
MemberMissionStatus.COMPLETE
);

return MemberConverter.toMyPageResponse(member, totalPoint);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,63 @@

import com.example.umc10th.domain.mission.dto.MissionReqDto;
import com.example.umc10th.domain.mission.dto.MissionResDto;
import com.example.umc10th.domain.mission.enums.MemberMissionStatus;
import com.example.umc10th.domain.mission.service.MissionService;
import com.example.umc10th.global.apiPayload.ApiResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/missions")
@RequestMapping("/api/v1/missions")
@RequiredArgsConstructor
@Validated
public class MissionController {

private final MissionService missionService;

@GetMapping("/{missionId}")
public ResponseEntity<MissionResDto.MissionInfo> getMission(@PathVariable Long missionId) {
return ResponseEntity.ok(missionService.getMission(missionId));
public ResponseEntity<ApiResponse<MissionResDto.MissionInfo>> getMission(@PathVariable Long missionId) {
return ResponseEntity.ok(ApiResponse.onSuccess(missionService.getMission(missionId)));
}

@PostMapping
public ResponseEntity<MissionResDto.MissionInfo> createMission(@Valid @RequestBody MissionReqDto.Create request) {
return ResponseEntity.ok(missionService.createMission(request));
public ResponseEntity<ApiResponse<MissionResDto.MissionInfo>> createMission(@Valid @RequestBody MissionReqDto.Create request) {
return ResponseEntity.ok(ApiResponse.onSuccess(missionService.createMission(request)));
}
}

@PostMapping("/my/challenging")
public ResponseEntity<ApiResponse<MissionResDto.MemberMissionPageResponse>> getMyChallengingMissions(
@Valid @RequestBody MissionReqDto.MyChallengingMissionsRequest request
) {
return ResponseEntity.ok(ApiResponse.onSuccess(missionService.getMyChallengingMissions(request)));
}

@GetMapping("/members/{memberId}")
public ResponseEntity<ApiResponse<MissionResDto.MemberMissionPageResponse>> getMemberMissions(
@PathVariable Long memberId,
@RequestParam MemberMissionStatus status,
@RequestParam(defaultValue = "1") @Min(1) Integer page
) {
return ResponseEntity.ok(ApiResponse.onSuccess(missionService.getMemberMissions(memberId, status, page)));
}

@GetMapping("/home")
public ResponseEntity<ApiResponse<MissionResDto.HomeMissionPageResponse>> getHomeMissions(
@RequestParam @NotNull Long regionId,
@RequestParam(required = false) Long memberId,
@RequestParam(defaultValue = "1") @Min(1) Integer page
) {
return ResponseEntity.ok(ApiResponse.onSuccess(missionService.getHomeMissions(regionId, memberId, page)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import com.example.umc10th.domain.mission.dto.MissionReqDto;
import com.example.umc10th.domain.mission.dto.MissionResDto;
import com.example.umc10th.domain.mission.entity.MemberMission;
import com.example.umc10th.domain.mission.entity.Mission;
import org.springframework.data.domain.Page;
import com.example.umc10th.domain.store.entity.Store;
import java.util.List;

public final class MissionConverter {

Expand All @@ -26,4 +29,59 @@ public static MissionResDto.MissionInfo toMissionInfo(Mission mission) {
mission.getRewardPoint()
);
}
}

public static MissionResDto.MemberMissionPageItem toMemberMissionPageItem(MemberMission memberMission) {
Mission mission = memberMission.getMission();

return new MissionResDto.MemberMissionPageItem(
memberMission.getId(),
mission.getId(),
mission.getStore().getName(),
mission.getContent(),
mission.getRewardPoint(),
memberMission.getStatus()
);
}

public static MissionResDto.HomeMissionPageItem toHomeMissionPageItem(Mission mission) {
return new MissionResDto.HomeMissionPageItem(
mission.getId(),
mission.getStore().getName(),
mission.getContent(),
mission.getRewardPoint(),
mission.getStore().getScore()
);
}

public static MissionResDto.MemberMissionPageResponse toMemberMissionPageResponse(Page<MemberMission> page) {
List<MissionResDto.MemberMissionPageItem> missions = page.getContent()
.stream()
.map(MissionConverter::toMemberMissionPageItem)
.toList();

return new MissionResDto.MemberMissionPageResponse(
missions,
missions.size(),
page.getTotalPages(),
page.getTotalElements(),
page.isFirst(),
page.isLast()
);
}

public static MissionResDto.HomeMissionPageResponse toHomeMissionPageResponse(Page<Mission> page) {
List<MissionResDto.HomeMissionPageItem> missions = page.getContent()
.stream()
.map(MissionConverter::toHomeMissionPageItem)
.toList();

return new MissionResDto.HomeMissionPageResponse(
missions,
missions.size(),
page.getTotalPages(),
page.getTotalElements(),
page.isFirst(),
page.isLast()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;

public class MissionReqDto {

Expand All @@ -12,4 +13,11 @@ public record Create(
@Min(0) int rewardPoint
) {
}
}

public record MyChallengingMissionsRequest(
@NotNull @Positive Long memberId,
@NotNull @Min(1) Integer page,
@NotNull @Min(1) Integer size
) {
}
}
Loading