Skip to content

Commit

Permalink
Merge pull request #19 from ThisIsComedy/feat/#15
Browse files Browse the repository at this point in the history
모든 통계 데이터 내보내기 기능 개발 완료
  • Loading branch information
hw9402 authored Nov 13, 2023
2 parents b46bf47 + 8b53d15 commit ac4f4c8
Show file tree
Hide file tree
Showing 14 changed files with 262 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package thisiscomedy.nodamnodam.server.domain.smoke.application;

import lombok.RequiredArgsConstructor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response.GrassGetResponse;
import thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response.SmokeCauseResponse;
import thisiscomedy.nodamnodam.server.domain.smoke.repository.SmokeRepository;
import thisiscomedy.nodamnodam.server.domain.user.application.UserGetService;
import thisiscomedy.nodamnodam.server.domain.user.domain.User;
Expand All @@ -18,11 +18,15 @@ public class SmokeGetService {
private final UserGetService userGetService;

public List<GrassGetResponse> getGrass() {
Long userId = Long.valueOf(SecurityContextHolder.getContext().getAuthentication().getName());
User user = userGetService.findById(userId);
User user = userGetService.getUser();

return smokeRepository.findByUser(user).stream()
.map(GrassGetResponse::new)
.toList();
}

public SmokeCauseResponse getCauseStats() {
User user = userGetService.getUser();
return smokeRepository.getSmokeCauseStats(user).get(0);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package thisiscomedy.nodamnodam.server.domain.smoke.application;

import lombok.RequiredArgsConstructor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import thisiscomedy.nodamnodam.server.domain.smoke.exception.AlreadyPressFailButton;
import thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.request.SmokeRequest;
import thisiscomedy.nodamnodam.server.domain.smoke.repository.SmokeRepository;
import thisiscomedy.nodamnodam.server.domain.user.application.UserGetService;
import thisiscomedy.nodamnodam.server.domain.user.application.UserSaveService;
import thisiscomedy.nodamnodam.server.domain.user.domain.User;

import java.time.ZoneId;
Expand All @@ -18,10 +18,10 @@ public class SmokeSaveService {

private final SmokeRepository smokeRepository;
private final UserGetService userGetService;
private final UserSaveService userSaveService;

public Long execute(SmokeRequest request) {
Long userId = Long.valueOf(SecurityContextHolder.getContext().getAuthentication().getName());
User userEntity = userGetService.findById(userId);
User user = userGetService.getUser();

if (smokeRepository.existsByCreatedAt(
new Date().toInstant()
Expand All @@ -30,6 +30,8 @@ public Long execute(SmokeRequest request) {
throw AlreadyPressFailButton.EXCEPTION;
}

return smokeRepository.save(request.toEntity(userEntity)).getId();
userSaveService.updateNoSmokeStartAt(user);

return smokeRepository.save(request.toEntity(user)).getId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response;

import thisiscomedy.nodamnodam.server.domain.smoke.domain.Moment;
import thisiscomedy.nodamnodam.server.domain.smoke.domain.Place;
import thisiscomedy.nodamnodam.server.domain.smoke.domain.Why;

public record SmokeCauseResponse(
String when,
Long whenCount,
String where,
Long whereCount,
String why,
Long whyCount
) {
public SmokeCauseResponse(Moment when, Long whenCount, Place where, Long whereCount, Why why, Long whyCount) {
this(
when.getDetails(), whenCount,
where.getDetails(),whereCount,
why.getDetails(), whyCount
);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package thisiscomedy.nodamnodam.server.domain.smoke.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import thisiscomedy.nodamnodam.server.domain.smoke.domain.Smoke;
import thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response.SmokeCauseResponse;
import thisiscomedy.nodamnodam.server.domain.user.domain.User;

import java.time.LocalDate;
Expand All @@ -14,4 +17,34 @@ public interface SmokeRepository extends JpaRepository<Smoke, Long> {
List<Smoke> findByUser(User user);

boolean existsByCreatedAt(LocalDate date);

@Query(value = """
select new thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response.SmokeCauseResponse(
s1.moment, s1.count,
s2.place, s2.count,
s3.why, s3.count
)
from (
select s.moment as moment, count(s.moment) as count
from Smoke s
where s.user = :user
group by s.moment
order by count(s.moment) desc
) s1,
(
select s.place as place, count(s.place) as count
from Smoke s
where s.user = :user
group by s.place
order by count(s.place)
) s2,
(
select s.why as why, count(s.why) as count
from Smoke s
where s.user = :user
group by s.why
order by count(s.why) desc
) s3
""")
List<SmokeCauseResponse> getSmokeCauseStats(@Param("user") User user);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,56 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import thisiscomedy.nodamnodam.server.domain.smoke.application.SmokeGetService;
import thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response.GrassGetResponse;
import thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response.SmokeCauseResponse;
import thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response.StatsGetBadgeResponse;
import thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response.StatsGetDetailsResponse;
import thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response.StatsGetSummaryResponse;
import thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response.StatsResponse;
import thisiscomedy.nodamnodam.server.domain.stats.repository.StatsRepository;
import thisiscomedy.nodamnodam.server.domain.user.application.UserGetService;
import thisiscomedy.nodamnodam.server.domain.user.domain.User;

import java.util.List;

@Service
@RequiredArgsConstructor
public class StatsGetService {

private final StatsRepository statsRepository;
private final UserGetService userGetService;
private final SmokeGetService smokeGetService;

public StatsGetBadgeResponse getBadge(User user) {
return statsRepository.findByUser(user)
.map(StatsGetBadgeResponse::new)
.orElse(null);
}

public StatsGetSummaryResponse getSummary() {
User user = userGetService.getUser();

return statsRepository.findByUser(user)
.map(StatsGetSummaryResponse::new)
.orElse(null);
}

public StatsResponse getDetails() {
User user = userGetService.getUser();

StatsGetDetailsResponse detailsResponse = statsRepository.findByUser(user)
.map(StatsGetDetailsResponse::new)
.orElse(null);

List<GrassGetResponse> grassGetResponse = smokeGetService.getGrass();

SmokeCauseResponse smokeCauseResponse = smokeGetService.getCauseStats();

return new StatsResponse(
detailsResponse,
grassGetResponse,
smokeCauseResponse
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package thisiscomedy.nodamnodam.server.domain.stats.presentation;

import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import thisiscomedy.nodamnodam.server.domain.stats.application.StatsGetService;
import thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response.StatsGetSummaryResponse;
import thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response.StatsResponse;

@RestController
@RequestMapping("/api/stats")
@RequiredArgsConstructor
public class StatsController {

private final StatsGetService statsGetService;

@GetMapping("/summary")
public ResponseEntity<StatsGetSummaryResponse> getSummary() {
return ResponseEntity.ok(statsGetService.getSummary());
}

@GetMapping("/details")
public ResponseEntity<StatsResponse> getDetails() {
return ResponseEntity.ok(statsGetService.getDetails());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response;

import lombok.Getter;
import thisiscomedy.nodamnodam.server.domain.stats.domain.Stats;

@Getter
public class StatsGetDetailsResponse {

private final int noSmokeDay;
private final int saveMoney;
private final int continuityNoSmoke;
private final int maximumContinuityNoSmoke;
private final int threeDayContinuityNoSmoke;
private final int smokeCount;

public StatsGetDetailsResponse(Stats stats) {
this.noSmokeDay = stats.getNoSmokeDay();
this.saveMoney = stats.getSaveMoney();
this.continuityNoSmoke = stats.getCurrentContinuityNoSmoke();
this.maximumContinuityNoSmoke = stats.getMaximumContinuityNoSmoke();
this.threeDayContinuityNoSmoke = stats.getThreeDayContinuityNoSmoke();
this.smokeCount = stats.getSmokeCount();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response;

import lombok.Getter;
import thisiscomedy.nodamnodam.server.domain.stats.domain.Stats;

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;

@Getter
public class StatsGetSummaryResponse {

private final long threeDayCurrentState;
private final int threeDayContinuityNoSmoke;
private final int saveMoney;

public StatsGetSummaryResponse(Stats stats) {
LocalDate userCreated = stats.getUser().getNoSmokeStartAt();
LocalDate currentDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

this.threeDayCurrentState = ChronoUnit.DAYS.between(currentDate, userCreated) % 3 + 1;
this.threeDayContinuityNoSmoke = stats.getThreeDayContinuityNoSmoke();
this.saveMoney = stats.getSaveMoney();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response;

import thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response.GrassGetResponse;
import thisiscomedy.nodamnodam.server.domain.smoke.presentation.dto.response.SmokeCauseResponse;

import java.util.List;

public record StatsResponse(
StatsGetDetailsResponse response,
List<GrassGetResponse> grass,
SmokeCauseResponse smokeCause
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package thisiscomedy.nodamnodam.server.domain.user.application;

import lombok.RequiredArgsConstructor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import thisiscomedy.nodamnodam.server.domain.stats.application.StatsGetService;
import thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response.StatsGetBadgeResponse;
import thisiscomedy.nodamnodam.server.domain.user.domain.User;
import thisiscomedy.nodamnodam.server.domain.user.exception.UserNotFoundException;
import thisiscomedy.nodamnodam.server.domain.user.presentation.dto.response.UserGetProfileResponse;
import thisiscomedy.nodamnodam.server.domain.user.repository.UserRepository;

@Service
@RequiredArgsConstructor
public class UserGetProfileService {

private final UserRepository userRepository;
private final StatsGetService statsGetService;

public UserGetProfileResponse execute() {
Long userId = Long.valueOf(SecurityContextHolder.getContext().getAuthentication().getName());

User user = userRepository.findById(userId)
.orElseThrow(() -> UserNotFoundException.EXCEPTION);

StatsGetBadgeResponse badgeInfo = statsGetService.getBadge(user);

return new UserGetProfileResponse(
user.getName(),
user.getEmail(),
user.getProfileUrl(),
badgeInfo.getNoSmokeDay(),
badgeInfo.getMaximumContinuityNoSmoke(),
badgeInfo.getSaveMoney(),
badgeInfo.getThreeDayContinuityNoSmoke()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,15 @@
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import thisiscomedy.nodamnodam.server.domain.stats.application.StatsGetService;
import thisiscomedy.nodamnodam.server.domain.stats.presentation.dto.response.StatsGetBadgeResponse;
import thisiscomedy.nodamnodam.server.domain.user.domain.User;
import thisiscomedy.nodamnodam.server.domain.user.exception.UserNotFoundException;
import thisiscomedy.nodamnodam.server.domain.user.presentation.dto.response.UserGetProfileResponse;
import thisiscomedy.nodamnodam.server.domain.user.repository.UserRepository;

@Service
@RequiredArgsConstructor
public class UserGetService {

private final UserRepository userRepository;
private final StatsGetService statsGetService;

public User getUser() {
Long userId = Long.valueOf(SecurityContextHolder.getContext().getAuthentication().getName());
Expand All @@ -27,27 +23,8 @@ public User findByEmail(String email) {
.orElseThrow(() -> UserNotFoundException.EXCEPTION);
}

public User findById(Long id) {
private User findById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> UserNotFoundException.EXCEPTION);
}

public UserGetProfileResponse getProfile() {
Long userId = Long.valueOf(SecurityContextHolder.getContext().getAuthentication().getName());

User user = userRepository.findById(userId)
.orElseThrow(() -> UserNotFoundException.EXCEPTION);

StatsGetBadgeResponse badgeInfo = statsGetService.getBadge(user);

return new UserGetProfileResponse(
user.getName(),
user.getEmail(),
user.getProfileUrl(),
badgeInfo.getNoSmokeDay(),
badgeInfo.getMaximumContinuityNoSmoke(),
badgeInfo.getSaveMoney(),
badgeInfo.getThreeDayContinuityNoSmoke()
);
}
}
Loading

0 comments on commit ac4f4c8

Please sign in to comment.