Skip to content

Commit

Permalink
Merge pull request #27 from 29sungdong/feat/user
Browse files Browse the repository at this point in the history
[feat] 유저 통계 API 구현
  • Loading branch information
suhhyun524 authored Nov 25, 2023
2 parents f7bbf93 + 48495c7 commit f8ba906
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.data.jpa.repository.JpaRepository;
import sungdong29.backend.domain.subPlace.domain.UserMission;
import sungdong29.backend.domain.user.domain.User;


public interface UserMissionRepository extends JpaRepository<UserMission, Long> {
Long countByUser(User user);
}

11 changes: 11 additions & 0 deletions src/main/java/sungdong29/backend/domain/user/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,17 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import sungdong29.backend.domain.user.dto.request.NicknameUpdateRequestDTO;
import sungdong29.backend.domain.user.dto.request.TokenRequestDTO;
import sungdong29.backend.domain.user.dto.request.UserRequestDTO;
import sungdong29.backend.domain.user.dto.response.StatsResponseDTO;
import sungdong29.backend.domain.user.dto.response.TokenResponseDTO;
import sungdong29.backend.domain.user.dto.response.UserResponseDTO;
import sungdong29.backend.domain.user.service.UserService;
import sungdong29.backend.global.config.LoginUser;
import sungdong29.backend.global.config.user.UserDetails;

@Slf4j
@RestController
Expand Down Expand Up @@ -43,4 +46,12 @@ public ResponseEntity<UserResponseDTO> updateUserNickname(@LoginUser Long userId
UserResponseDTO userResponseDTO = userService.updateUserNickname(userId, nicknameUpdateRequestDTO);
return ResponseEntity.ok(userResponseDTO);
}

@Operation(summary = "통계")
@GetMapping("stats")
public ResponseEntity<StatsResponseDTO> getUserStats(@AuthenticationPrincipal UserDetails userDetails) {
log.info("통계");
StatsResponseDTO statsResponseDTO = userService.getUserStats(userDetails);
return ResponseEntity.ok(statsResponseDTO);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package sungdong29.backend.domain.user.dto.response;

import lombok.Builder;
import lombok.Getter;

@Getter
public class StatsResponseDTO {

private int placePercent;
private int missionPercent;

@Builder
private StatsResponseDTO(int placePercent, int missionPercent) {
this.placePercent = placePercent;
this.missionPercent = missionPercent;
}

public static StatsResponseDTO of(int placePercent, int missionPercent) {
return StatsResponseDTO.builder()
.placePercent(placePercent)
.missionPercent(missionPercent)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package sungdong29.backend.domain.user.helper;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import sungdong29.backend.domain.place.repository.PlaceRepository;
import sungdong29.backend.domain.subPlace.repository.MissionRepository;
import sungdong29.backend.domain.subPlace.repository.UserMissionRepository;
import sungdong29.backend.domain.user.domain.User;
import sungdong29.backend.domain.walk.repository.WalkRepository;

@Component
@RequiredArgsConstructor
public class UserHelper {

private final WalkRepository walkRepository;
private final PlaceRepository placeRepository;
private final UserMissionRepository userMissionRepository;
private final MissionRepository missionRepository;

public int calcPlacePercent(User user) {
Long placeNum = walkRepository.countByUser(user);
long totalPlace = placeRepository.count();

return (int) ((double)placeNum / totalPlace * 100);
}

public int calcMissionPercent(User user) {
Long missionNum = userMissionRepository.countByUser(user);
long totalMission = missionRepository.count();

return (int) ((double) missionNum / totalMission * 100);
}
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,31 @@
package sungdong29.backend.domain.user.service;


import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import sungdong29.backend.domain.user.domain.User;
import sungdong29.backend.domain.user.dto.request.NicknameUpdateRequestDTO;
import sungdong29.backend.domain.user.dto.request.TokenRequestDTO;
import sungdong29.backend.domain.user.dto.request.UserRequestDTO;
import sungdong29.backend.domain.user.dto.response.StatsResponseDTO;
import sungdong29.backend.domain.user.dto.response.TokenResponseDTO;
import sungdong29.backend.domain.user.dto.response.UserResponseDTO;
import sungdong29.backend.domain.user.exception.DuplicateNickname;
import sungdong29.backend.domain.user.exception.DuplicateUsername;
import sungdong29.backend.domain.user.exception.UserNotFound;
import sungdong29.backend.domain.user.helper.UserHelper;
import sungdong29.backend.domain.user.repository.UserRepository;
import org.springframework.security.crypto.password.PasswordEncoder;
import sungdong29.backend.global.config.jwt.TokenProvider;
import sungdong29.backend.global.config.user.UserDetails;

@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {

private final UserHelper userHelper;
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
private final TokenProvider tokenProvider;
Expand Down Expand Up @@ -79,4 +83,12 @@ public UserResponseDTO updateUserNickname(Long userId, NicknameUpdateRequestDTO

return UserResponseDTO.from(user);
}

public StatsResponseDTO getUserStats(UserDetails userDetails) {
final User user = userDetails.getUser();
int placePercent = userHelper.calcPlacePercent(user);
int missionPercent = userHelper.calcMissionPercent(user);

return StatsResponseDTO.of(placePercent, missionPercent);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package sungdong29.backend.domain.walk.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import sungdong29.backend.domain.user.domain.User;
import sungdong29.backend.domain.walk.domain.Walk;

public interface WalkRepository extends JpaRepository<Walk, Long> {
Long countByUser(User user);
}

0 comments on commit f8ba906

Please sign in to comment.