Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

모든 통계 데이터 내보내기 기능 개발 완료 #19

Merged
merged 5 commits into from
Nov 13, 2023
Merged
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
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