diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java index f4b7c25812c8bf0ee7f7206fe7bbabefde9812c9..56bd7cb344f1f31fcd26ac45a8231eb553a98bd2 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java @@ -140,9 +140,9 @@ public class UserController { @ApiResponse(responseCode = "200", description = "Success"), @ApiResponse(responseCode = "404", description = "User not found"), }) - public List<Double> userHouseStatistics( + public Double userHouseStatistics( @RequestBody UserStatisticsCreateDto createStatDto) { - return userService.getConsumption(createStatDto.getId(), createStatDto.getHouseId(), + return userService.getConsumption(createStatDto.getUserId(), createStatDto.getHouseId(), createStatDto.getStartTime(), createStatDto.getEndTime()); } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserRepository.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserRepository.java index 2526372ec8950faab64cbc8357502337ca407423..7b3a836ad846bed651be897e407dc70b9845979b 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/user/UserRepository.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserRepository.java @@ -18,14 +18,14 @@ public interface UserRepository extends JpaRepository<User, String> { int update(@Param("user") User user, @Param("id") String id); - @Query("Select m.consumptionKWH " + + @Query("Select SUM(m.consumptionKWH) " + "From User u " + "INNER JOIN House h " + "INNER JOIN SmartMeter s " + "INNER JOIN Metrics m " + "where u.id = :#{#userId} and h.id = :#{#houseId} and m.timeStamp >= :#{#startTime} and m.timeStamp <= :#{#endTime}") - List<Double> getStatisticsData(@Param("userId") String userId, + Double getStatisticsData(@Param("userId") String userId, @Param("houseId") String houseId, @Param("startTime") LocalDateTime startTime, - @Param("startTime") LocalDateTime endTime); + @Param("endTime") LocalDateTime endTime); } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserService.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserService.java index f20afdfd4734929e2dcfae30ded8319560580bae..eb39e986567c7c51e761a12a14e11a4f73445585 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/user/UserService.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserService.java @@ -30,7 +30,7 @@ public class UserService extends DomainService<User> { } @Transactional(readOnly = true) - public List<Double> getConsumption(String userId, + public Double getConsumption(String userId, String houseId, LocalDateTime startTime, LocalDateTime endTime) { diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsCreateDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsCreateDto.java index 0c7fe3d71579c44dafaf4875329e82148f2cbf7c..5884c44ffd86481afffc74f5f84d62d5d9950beb 100644 --- a/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsCreateDto.java +++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsCreateDto.java @@ -1,7 +1,11 @@ package cz.muni.fi.pa165.model.dto.metrics; import cz.muni.fi.pa165.model.dto.common.DomainObjectDto; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter public class MetricsCreateDto extends DomainObjectDto { private double consumptionKWH; } diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsDto.java index 20c1ddca95de6060325cfb549b646dfb57c32e08..2907ffa1a50d5f4e33ca394f665dde5deffa9a21 100644 --- a/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsDto.java +++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsDto.java @@ -1,7 +1,11 @@ package cz.muni.fi.pa165.model.dto.metrics; import cz.muni.fi.pa165.model.dto.common.DomainObjectDto; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter public class MetricsDto extends DomainObjectDto { private double consumptionKWH; } diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsUpdateDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsUpdateDto.java index 99556ef0be0ca3b9acd7301e44f7d9f335e349bd..d4904ba92d39a35adf99673a8b098c2136fa7b34 100644 --- a/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsUpdateDto.java +++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsUpdateDto.java @@ -1,7 +1,11 @@ package cz.muni.fi.pa165.model.dto.metrics; import cz.muni.fi.pa165.model.dto.common.DomainObjectDto; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter public class MetricsUpdateDto extends DomainObjectDto { private double consumptionKWH; } diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserStatisticsCreateDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserStatisticsCreateDto.java index 098d93430030af610250b3d621d98cb2fa806569..c7b405f675b2fe5a4f7029b4cccc1c26b624210f 100644 --- a/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserStatisticsCreateDto.java +++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserStatisticsCreateDto.java @@ -9,7 +9,7 @@ import java.time.LocalDateTime; @Setter public class UserStatisticsCreateDto { - private String id; + private String userId; private String houseId; private LocalDateTime startTime; private LocalDateTime endTime; diff --git a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticCreateDto.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticCreateDto.java index 484ed505f017f884deed133b368a42495f8405cb..90ef59ec270d0a1fb9e7e642178c1ee56b3993b5 100644 --- a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticCreateDto.java +++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticCreateDto.java @@ -18,7 +18,6 @@ import java.util.Date; @Builder @Data public class StatisticCreateDto { - private String id; private String userId; @Email private String userEmail; diff --git a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticRepository.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticRepository.java index f8c79bbb8d07da26e5a23bf945b2c7aeb7cbf39d..7c5df6b66be1df76c847a8da821342980d0c56ef 100644 --- a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticRepository.java +++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticRepository.java @@ -11,12 +11,12 @@ import java.util.List; @Repository public interface StatisticRepository extends JpaRepository<UserStatistic, String> { - @Query("select name, userId, monthNum, yearNum, monthlyConsumption from UserStatistic where userId = :#{#userId}") + @Query("select new UserStatistic (u.id, u.userId, u.userEmail, u.houseId, u.monthNum, u.yearNum, u.monthlyConsumption, u.name) from UserStatistic u where u.userId = :#{#userId}") List<UserStatistic> findAllByUser(@Param("userId") String userId); - @Query("select id, name, userId, monthNum, yearNum, monthlyConsumption from UserStatistic where userId = :#{#userId} and houseId = :#{#houseId}") + @Query("select new UserStatistic (u.id, u.userId, u.userEmail, u.houseId, u.monthNum, u.yearNum, u.monthlyConsumption, u.name) from UserStatistic u where u.userId = :#{#userId} and u.houseId = :#{#houseId}") List<UserStatistic> findAllByUserAndHouse(@Param("userId") String userId, @Param("houseId") String houseId); - @Query("select id, name, userId, monthNum, yearNum, monthlyConsumption from UserStatistic where userId = :#{#userId} and houseId = :#{#houseId} and monthNum = :#{#month} and yearNum = :#{#year}") + @Query("select new UserStatistic(u.id, u.userId, u.userEmail, u.houseId, u.monthNum, u.yearNum, u.monthlyConsumption, u.name) from UserStatistic u where u.userId = :#{#userId} and u.houseId = :#{#houseId} and u.monthNum = :#{#month} and u.yearNum = :#{#year}") UserStatistic findUserHouseDateStatistics(@Param("userId") String userId, @Param("houseId") String houseId, @Param("month") int month, @Param("year") int year); } diff --git a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticService.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticService.java index ca349d7c01d79deade0bdf0cb23d3316a5ae1b50..cd61ce68ba209ec860a2ed4d84d2b72c5af2612a 100644 --- a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticService.java +++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticService.java @@ -7,6 +7,7 @@ import org.apache.http.client.methods.HttpHead; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -39,6 +40,11 @@ public class StatisticService { if (statistic == null){ userStatistic.setId(UUID.randomUUID().toString()); + userStatistic.setName(String.format("User%s_house%s_%d/%d.", + userStatistic.getUserEmail(), + userStatistic.getHouseId(), + userStatistic.getMonthNum(), + userStatistic.getYearNum())); userStatistic.setMonthlyConsumption(GenerateStatistic(userStatistic)); repository.save(userStatistic); return userStatistic; @@ -60,34 +66,53 @@ public class StatisticService { } private double GenerateStatistic(UserStatistic userStatistic) throws IOException { - // TODO: get first and last day of month - LocalDateTime startDateTime = LocalDateTime.of(2023,3,1,0,0,0,1); - LocalDateTime lastDateTime = LocalDateTime.of(2023,3,30,0,0,0,1); + + LocalDateTime startDateTime = GetFirstDayOfMonth(userStatistic.getYearNum(), userStatistic.getMonthNum()); + LocalDateTime lastDateTime = GetLastDayOfMonth(userStatistic.getYearNum(), userStatistic.getMonthNum()); String payload = String.format(""" { - "id": "%s", + "userId": "%s", "houseId": "%s", - "startTime": "%s" + "startTime": "%s", "endTime": "%s" } - """, userStatistic.getId(), + """, userStatistic.getUserId(), userStatistic.getHouseId(), startDateTime, lastDateTime); StringEntity entity = new StringEntity(payload, - ContentType.APPLICATION_FORM_URLENCODED); + ContentType.APPLICATION_JSON); HttpClient httpClient = HttpClientBuilder.create().build(); HttpPost request = new HttpPost("http://localhost:8080/api/user/statistics"); request.setEntity(entity); request.setHeader("Content-Type", "application/json"); - request.setHeader("accept:", "*/*"); HttpResponse response = httpClient.execute(request); - System.out.println(response.getStatusLine().getStatusCode()); - HttpEntity content = response.getEntity(); - //System.out.println(content.); - return 0; + + // TODO: assert response equals 200 and write message if not + + String result = EntityUtils.toString(response.getEntity()); + + return result.isEmpty() ? 0 + : Double.valueOf(result); + } + + private LocalDateTime GetLastDayOfMonth(int year, int month){ + LocalDateTime date = LocalDateTime.of(year, + month,1,0,0,0,0); + date.plusMonths(1); + date.minusDays(1); + + return LocalDateTime.of(year, + month, + date.getDayOfMonth(), + 23,59,59,999999); + } + + private LocalDateTime GetFirstDayOfMonth(int year, int month){ + return LocalDateTime.of(year, + month,1,0,0,0,0); } } diff --git a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticsFacade.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticsFacade.java new file mode 100644 index 0000000000000000000000000000000000000000..aa0598830804fb2e0b896652647e6c12bfbaceb9 --- /dev/null +++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/StatisticsFacade.java @@ -0,0 +1,40 @@ +package cz.muni.fi.pa165.statistics.statistics; + +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestParam; + +import java.io.IOException; +import java.util.List; + +@Component +@Transactional +public class StatisticsFacade { + + private final StatisticService statisticService; + + private final UserStatisticsMapper mapper; + @Autowired + public StatisticsFacade(StatisticService statisticService, UserStatisticsMapper mapper) { + this.statisticService = statisticService; + this.mapper = mapper; + } + + @Transactional + public UserStatisticsDto CreateStatistics(StatisticCreateDto entity) throws IOException { + return mapper.toDto(statisticService.CreateStatistic(mapper.fromDto(entity))); + } + + @Transactional + public List<UserStatisticsDto> FindAllByUser(String userId){ + return mapper.toDtoList(statisticService.findAllUserStatistics(userId)); + } + + @Transactional + public List<UserStatisticsDto> findHouseStatisticsByUser(String userId, + String houseId) { + return mapper.toDtoList(statisticService.findAllUserStatisticsByHouse(userId, houseId)); + } +} diff --git a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatistic.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatistic.java index abdab02467ec5ee5377e14e07bf299529857e1a2..01979e6397b1e45d26c7fc4aafc328d69dd77fba 100644 --- a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatistic.java +++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatistic.java @@ -27,5 +27,5 @@ public class UserStatistic { private int monthNum; private int yearNum; private Double monthlyConsumption; - private String name = String.format("User%s_house%s_%d/%d.", userEmail, houseId, monthNum, yearNum); + private String name; } diff --git a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsController.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsController.java index f626f0e7258243125e0c17bf26a99f5f65f755dd..bc6b196375f4c21c65a3b2ae0e57c1be92ca6283 100644 --- a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsController.java +++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsController.java @@ -3,7 +3,6 @@ package cz.muni.fi.pa165.statistics.statistics; import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -13,46 +12,36 @@ import java.util.List; @RequestMapping("/api/user-statistics") public class UserStatisticsController { - private final StatisticService statisticService; - private final UserStatisticsMapper mapper; + private final StatisticsFacade statisticsFacade; @Autowired - public UserStatisticsController(StatisticService statisticService, UserStatisticsMapper mapper) + public UserStatisticsController(StatisticsFacade statisticsFacade) { - this.statisticService = statisticService; - this.mapper = mapper; + this.statisticsFacade = statisticsFacade; } @Operation( summary = "Create statistics", description = "Creates a new statistics.") @PostMapping - public ResponseEntity create(@RequestBody @Valid StatisticCreateDto createDto) throws IOException { - /*try - {*/ - statisticService.CreateStatistic(mapper.fromDto(createDto)); - return ResponseEntity.ok().build(); - /*} - catch (Exception e) - {*/ - // return ResponseEntity.internalServerError(e.getMessage()).build(); - //} + public UserStatisticsDto create(@RequestBody @Valid StatisticCreateDto createDto) throws IOException { + return statisticsFacade.CreateStatistics(createDto); } @Operation( summary = "Get user statistics", description = "Get user statistics.") @GetMapping("/all") - public List<UserStatistic> findAllByUser(@RequestParam @Valid String userId) { - return statisticService.findAllUserStatistics(userId); + public List<UserStatisticsDto> findAllByUser(@RequestParam @Valid String userId) { + return statisticsFacade.FindAllByUser(userId); } @Operation( summary = "Get user statistics for house", description = "Get user statistics for house.") @GetMapping("/user") - public List<UserStatistic> findHouseStatisticsByUser(@RequestParam @Valid String userId, + public List<UserStatisticsDto> findHouseStatisticsByUser(@RequestParam @Valid String userId, @RequestParam @Valid String houseId) { - return statisticService.findAllUserStatistics(userId); + return statisticsFacade.findHouseStatisticsByUser(userId, houseId); } } diff --git a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsDto.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsDto.java new file mode 100644 index 0000000000000000000000000000000000000000..2028028310aa7dc33466630ce2aa26a6aae507b5 --- /dev/null +++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsDto.java @@ -0,0 +1,27 @@ +package cz.muni.fi.pa165.statistics.statistics; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@Builder +@Data +public class UserStatisticsDto { + private String userId; + @Email + private String userEmail; + private String houseId; + @Min(1) + @Max(12) + private int monthNum; + @Min(2000) + @Max(2030) + private int yearNum; + private Double monthlyConsumption; +} diff --git a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsMapper.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsMapper.java index 670a02b8223259ede9b97b1d6d1b54e7e03da4ec..499d8b6f027e9eb2e6d7b208f30241bd916a3a0e 100644 --- a/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsMapper.java +++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/statistics/UserStatisticsMapper.java @@ -2,7 +2,12 @@ package cz.muni.fi.pa165.statistics.statistics; import org.mapstruct.Mapper; +import java.util.List; + @Mapper public interface UserStatisticsMapper{ UserStatistic fromDto(StatisticCreateDto entity); + UserStatisticsDto toDto(UserStatistic entity); + + List<UserStatisticsDto> toDtoList(List<UserStatistic> entities); }