diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..b6be142eca1df3e42e1381c80349b2c040bf8a16 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,22 @@ +cache: + paths: + - .m2/ + +stages: + - build + - test + +maven-build: + image: maven:3.8.5-openjdk-17 + stage: build + script: "mvn clean package -DskipTests" + artifacts: + paths: + - target/ + +maven-test: + image: maven:3.8.5-openjdk-17 + stage: test + script: "mvn test" + dependencies: + - maven-build diff --git a/src/main/java/hdm/mi/growbros/controllers/GardenController.java b/src/main/java/hdm/mi/growbros/controllers/GardenController.java index 4f42d399be5fc2def5fae2badeec5a61baed9497..db636f8829ca4f979c92cbbc3a02ddee535c1e9e 100644 --- a/src/main/java/hdm/mi/growbros/controllers/GardenController.java +++ b/src/main/java/hdm/mi/growbros/controllers/GardenController.java @@ -60,14 +60,11 @@ public class GardenController { ) { return gardenService.clearGarden(user); } - - - @GetMapping ("/getPlantsNeedingWatering") - public ResponseEntity<String> getPlantsNeedingWatring (@AuthenticationPrincipal User user){ - return ResponseEntity.ok(gardenService.notifyAboutPlantsNeedingWatering(user)); - } @PostMapping("/setNewWateringFrequency") public void setNewWateringService(@RequestParam("wateringFrequency") int wateringFrequency , @RequestBody GardenEntry gardenEntry){ gardenEntry.setWateringFrequency(wateringFrequency); } + + + } diff --git a/src/main/java/hdm/mi/growbros/controllers/GrandmaController.java b/src/main/java/hdm/mi/growbros/controllers/GrandmaController.java index 9b692b8ae2646fdb2f5358f7140dbab58da1acd8..f1141a36efaccc5e02ab257d4377cd3f815216af 100644 --- a/src/main/java/hdm/mi/growbros/controllers/GrandmaController.java +++ b/src/main/java/hdm/mi/growbros/controllers/GrandmaController.java @@ -1,13 +1,15 @@ package hdm.mi.growbros.controllers; +import hdm.mi.growbros.models.GardenEntry; +import hdm.mi.growbros.models.plant.Plant; import hdm.mi.growbros.models.user.User; import hdm.mi.growbros.service.GrandmaService; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/api/v1/Grandma") @@ -24,8 +26,17 @@ public class GrandmaController { return ResponseEntity.ok(grandmaService.growingTippDesTages(user)); } @GetMapping ("/getGrowablePlants") - public ResponseEntity<String> getPlantsReadyToGrow(@AuthenticationPrincipal User user){ - return ResponseEntity.ok(grandmaService.notifyAboutPlantsReadyToGrow(user)); + public ResponseEntity<List<Plant>> getPlantsReadyToGrow(@AuthenticationPrincipal User user){ + return ResponseEntity.ok(grandmaService.getPlantsReadyToGrow(user)); } + @GetMapping ("/getPlantsNeedingWatering") + public ResponseEntity<List<GardenEntry>> getPlantsNeedingWatring (@AuthenticationPrincipal User user){ + return ResponseEntity.ok(grandmaService.getGardenEntriesNeedingWatering(user)); + } + @GetMapping("/getPlantsReadyToHarvest") + public ResponseEntity<List<GardenEntry>> getPlantsReadyToHarvest(@AuthenticationPrincipal User user){ + List<GardenEntry> plantsReadyToHarvest = grandmaService.getPlantsReadyToHarvest(user); + return ResponseEntity.ok(plantsReadyToHarvest); + } } diff --git a/src/main/java/hdm/mi/growbros/models/GardenEntry.java b/src/main/java/hdm/mi/growbros/models/GardenEntry.java index dde6744331a505fc97f7e39be576a67f2ae7e558..5678e0d3923e66dd3640aff4ad016a1f9f74228f 100644 --- a/src/main/java/hdm/mi/growbros/models/GardenEntry.java +++ b/src/main/java/hdm/mi/growbros/models/GardenEntry.java @@ -4,9 +4,9 @@ import hdm.mi.growbros.models.plant.Plant; import hdm.mi.growbros.models.user.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; -import lombok.Getter; +import lombok.Builder; +import lombok.Data; import lombok.NoArgsConstructor; -import lombok.Setter; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -16,8 +16,8 @@ import java.util.Objects; @Entity @EntityListeners(AuditingEntityListener.class) -@Getter -@Setter +@Data +@Builder @AllArgsConstructor @NoArgsConstructor public class GardenEntry { diff --git a/src/main/java/hdm/mi/growbros/service/GardenService.java b/src/main/java/hdm/mi/growbros/service/GardenService.java index c9e3a1e5c4bfa76ecbfc9d9b8cf911b8db59ce39..b851da70f3cffbfc111733c0bbe35586567e3278 100644 --- a/src/main/java/hdm/mi/growbros/service/GardenService.java +++ b/src/main/java/hdm/mi/growbros/service/GardenService.java @@ -13,8 +13,6 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -92,78 +90,7 @@ public class GardenService { - public List<GardenEntry> getGardenEntriesNeedingWatering(User user) { - List<GardenEntry> plantsNeedingWatering = new ArrayList<>(); - List<GardenEntry> plantsInUsersGarden = gardenRepository.findByUser(user); - if(plantsInUsersGarden.isEmpty()){ - return plantsNeedingWatering; - } - - for( int index = 1 ; index < plantsInUsersGarden.size();index++){ - if(plantsInUsersGarden.get(index).getWateringFrequency() == 0 ){ - switch (plantsInUsersGarden.get(index).getPlant().getWaterDemand()){ - case DRY -> { - if(getDaysSinceLastWatering(plantsInUsersGarden.get(index).getTimeSinceLastWatering()) > 14) { - plantsNeedingWatering.add(plantsInUsersGarden.get(index)); - } - } - case WET -> { - if(getDaysSinceLastWatering(plantsInUsersGarden.get(index).getTimeSinceLastWatering()) > 7) { - plantsNeedingWatering.add(plantsInUsersGarden.get(index)); - } - } - case VERY_WET -> { - if(getDaysSinceLastWatering(plantsInUsersGarden.get(index).getTimeSinceLastWatering()) > 3) { - plantsNeedingWatering.add(plantsInUsersGarden.get(index)); - } - } - } - }else if (getDaysSinceLastWatering(plantsInUsersGarden.get(index).getTimeSinceLastWatering()) > plantsNeedingWatering.get(index).getWateringFrequency()){ - plantsNeedingWatering.add(plantsInUsersGarden.get(index)); - } - } - - return plantsNeedingWatering; - - } - - - - - - - - public String notifyAboutPlantsNeedingWatering(User user) { - List<GardenEntry> plantsNeedingWatering = getGardenEntriesNeedingWatering(user); - StringBuilder notification = new StringBuilder("Diese Pflanzen in deinem Garten brauchen Wasser"); - if(!plantsNeedingWatering.isEmpty()){ - int size = plantsNeedingWatering.size(); - for (int i = 0; i < size; i++) { - notification.append(plantsNeedingWatering.get(i).getPlant().getName()); - if (i < size - 2) { - notification.append(", "); - } else if (i == size - 2) { - notification.append(" und "); - } - } - - } - return String.valueOf(notification); - } - - - - - - - private long getDaysSinceLastWatering(LocalDate lastWateringDate) { - if (lastWateringDate != null) { - LocalDate currentDate = LocalDate.now(); - return ChronoUnit.DAYS.between(lastWateringDate, currentDate); - } - return 0; - } } diff --git a/src/main/java/hdm/mi/growbros/service/GrandmaService.java b/src/main/java/hdm/mi/growbros/service/GrandmaService.java index 7c0b8b4d500dced98537b0d4bcabec09ace2aedf..669833cf1ffbe33d5742a6ec580be878eeb1d587 100644 --- a/src/main/java/hdm/mi/growbros/service/GrandmaService.java +++ b/src/main/java/hdm/mi/growbros/service/GrandmaService.java @@ -1,20 +1,22 @@ package hdm.mi.growbros.service; +import hdm.mi.growbros.models.GardenEntry; import hdm.mi.growbros.models.WishListEntry; import hdm.mi.growbros.models.plant.Plant; import hdm.mi.growbros.models.user.User; +import hdm.mi.growbros.repositories.GardenRepository; import hdm.mi.growbros.repositories.WishListRepository; import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.time.temporal.WeekFields; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Random; +import java.util.*; @Service - +@RequiredArgsConstructor public class GrandmaService { @@ -25,11 +27,9 @@ public class GrandmaService { private final GardenService gardenService; - public GrandmaService(WishListRepository wishListRepository , GardenService gardenService) { + private final GardenRepository gardenRepository; + - this.wishListRepository = wishListRepository; - this.gardenService = gardenService; - } public String growingTippDesTages(User user) { @@ -42,26 +42,7 @@ public class GrandmaService { } - public String notifyAboutPlantsReadyToGrow(User user){ - List<Plant> plantsReadyToGrow = getPlantsReadyToGrow(user); - if (plantsReadyToGrow.isEmpty()) { - return ""; - } - StringBuilder notification = new StringBuilder("Diese Pflanzen in deiner Wunschliste wären bereit zum Einpflanzen: "); - int size = plantsReadyToGrow.size(); - for (int i = 0; i < size; i++) { - notification.append(plantsReadyToGrow.get(i).getName()); - if (i < size - 2) { - notification.append(", "); - } else if (i == size - 2) { - notification.append(" und "); - } - } - return notification.toString(); - } - - - private List<Plant> getPlantsReadyToGrow( User user) { + public List<Plant> getPlantsReadyToGrow( User user) { LocalDate today = LocalDate.now(); int weekNumber = today.get(WeekFields.of(Locale.getDefault()).weekOfWeekBasedYear()); @@ -78,4 +59,71 @@ public class GrandmaService { return plantsReadyToGrow; } + + public List<GardenEntry> getGardenEntriesNeedingWatering(User user) { + List<GardenEntry> plantsNeedingWatering = new ArrayList<>(); + List<GardenEntry> plantsInUsersGarden = gardenRepository.findByUser(user); + if(plantsInUsersGarden.isEmpty()){ + return plantsNeedingWatering; + } + + for( int index = 1 ; index < plantsInUsersGarden.size();index++){ + if(plantsInUsersGarden.get(index).getWateringFrequency() == 0 ){ + switch (plantsInUsersGarden.get(index).getPlant().getWaterDemand()){ + case DRY -> { + if(getDaysSinceLastWatering(plantsInUsersGarden.get(index).getTimeSinceLastWatering()) > 14) { + plantsNeedingWatering.add(plantsInUsersGarden.get(index)); + } + } + case WET -> { + if(getDaysSinceLastWatering(plantsInUsersGarden.get(index).getTimeSinceLastWatering()) > 7) { + plantsNeedingWatering.add(plantsInUsersGarden.get(index)); + } + } + case VERY_WET -> { + if(getDaysSinceLastWatering(plantsInUsersGarden.get(index).getTimeSinceLastWatering()) > 3) { + plantsNeedingWatering.add(plantsInUsersGarden.get(index)); + } + } + } + }else if (getDaysSinceLastWatering(plantsInUsersGarden.get(index).getTimeSinceLastWatering()) > plantsNeedingWatering.get(index).getWateringFrequency()){ + plantsNeedingWatering.add(plantsInUsersGarden.get(index)); + } + } + + return plantsNeedingWatering; + + + } + + + private long getDaysSinceLastWatering(LocalDate lastWateringDate) { + if (lastWateringDate != null) { + LocalDate currentDate = LocalDate.now(); + return ChronoUnit.DAYS.between(lastWateringDate, currentDate); + } + return 0; + } + + public List<GardenEntry> getPlantsReadyToHarvest (User user){ + + + List<GardenEntry> usersPlants = gardenRepository.findByUser(user); + + List<GardenEntry> plantsReadyToHarvest = new ArrayList<>(); + + for(GardenEntry entry : usersPlants){ + int growthDuration = entry.getPlant().getGrowthDuration(); + LocalDate createdAt = entry.getCreatedAt().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate currentDate = LocalDate.now(); + if(growthDuration != 0 ) { + if (growthDuration >= ChronoUnit.WEEKS.between(createdAt, currentDate)) { + plantsReadyToHarvest.add(entry); + } + } + + } + return plantsReadyToHarvest; + + } } diff --git a/src/test/java/hdm/mi/growbros/repositories/GardenRepositoryTest.java b/src/test/java/hdm/mi/growbros/repositories/GardenRepositoryTest.java index 6aa97c9ff6e3a85017ae3880d45f037e5bd7a8ae..7873ad501cf4e1af2bcf684a6d563eff7d698a6a 100644 --- a/src/test/java/hdm/mi/growbros/repositories/GardenRepositoryTest.java +++ b/src/test/java/hdm/mi/growbros/repositories/GardenRepositoryTest.java @@ -70,10 +70,10 @@ class GardenRepositoryTest { .harvestWeekEnd(30) .build(); entityManager.persist(p3); - ge1 = new GardenEntry(0L, p1, user1, null); - ge2 = new GardenEntry(0L, p2, user1, null); - ge3 = new GardenEntry(0L, p3, user1, null); - ge4 = new GardenEntry(0L, p3, user2, null); + ge1 = GardenEntry.builder().id(0L).plant(p1).user(user1).build(); + ge2 = GardenEntry.builder().id(0L).plant(p2).user(user1).build(); + ge3 = GardenEntry.builder().id(0L).plant(p3).user(user1).build(); + ge4 = GardenEntry.builder().id(0L).plant(p3).user(user2).build(); underTest.saveAll(List.of(ge1, ge2, ge3, ge4)); } diff --git a/src/test/java/hdm/mi/growbros/service/GardenServiceTest.java b/src/test/java/hdm/mi/growbros/service/GardenServiceTest.java index b672464d13dfd5083c5f9ad318c46f44f17a476d..b61a4b092a847327a26f1db4831ae2cefc61c5f6 100644 --- a/src/test/java/hdm/mi/growbros/service/GardenServiceTest.java +++ b/src/test/java/hdm/mi/growbros/service/GardenServiceTest.java @@ -48,7 +48,7 @@ class GardenServiceTest { when(plantRepository.findById(1L)).thenReturn(Optional.of(plant)); when(gardenRepository.save( any(GardenEntry.class)) - ).thenReturn(new GardenEntry(0L, plant, null, null)); + ).thenReturn(GardenEntry.builder().plant(plant).build()); //assert var result = gardenService.addPlantToGarden(1L, UserTestData.getUser1()); @@ -68,23 +68,23 @@ class GardenServiceTest { User user = UserTestData.getUser1(); - when(gardenRepository.findByUser(user, Sort.by("createdDate"))).thenReturn(mapPlantsToGardenEntries(orderedByCreatedMock, user)); + when(gardenRepository.findByUser(user, Sort.by("createdAt").descending())).thenReturn(mapPlantsToGardenEntries(orderedByCreatedMock, user)); when(gardenRepository.findByUser(user, Sort.by("plant.name"))).thenReturn(mapPlantsToGardenEntries(orderedByNameMock, user)); when(gardenRepository.findAllByNearestHarvestWeek(eq(user), any(int.class))).thenReturn(mapPlantsToGardenEntries(orderedByHarvestMock, user)); when(gardenRepository.findAllByNearestPlantingWeek(eq(user), any(int.class))).thenReturn(mapPlantsToGardenEntries(orderedByPlantDateMock, user)); assertAll( - () -> assertEquals(gardenService.getUserPlants(user, null), orderedByNameMock), - () -> assertEquals(gardenService.getUserPlants(user, "random stuff"), orderedByNameMock), - () -> assertEquals(gardenService.getUserPlants(user, "createdAt"), orderedByCreatedMock), - () -> assertEquals(gardenService.getUserPlants(user, "plantDate"), orderedByPlantDateMock), - () -> assertEquals(gardenService.getUserPlants(user, "harvestDate"), orderedByHarvestMock) + () -> assertEquals(orderedByNameMock, gardenService.getUserPlants(user, null)), + () -> assertEquals(orderedByNameMock, gardenService.getUserPlants(user, "random stuff")), + () -> assertEquals(orderedByCreatedMock, gardenService.getUserPlants(user, "createdAt")), + () -> assertEquals(orderedByPlantDateMock, gardenService.getUserPlants(user, "plantDate")), + () -> assertEquals(orderedByHarvestMock, gardenService.getUserPlants(user, "harvestDate")) ); } private List<GardenEntry> mapPlantsToGardenEntries(List<Plant> plants, User user) { return plants.stream() - .map(plant -> new GardenEntry(0L, plant, user, null)) + .map(plant -> GardenEntry.builder().plant(plant).id(0L).user(user).build()) .toList(); } } diff --git a/src/test/java/hdm/mi/growbros/service/PlantsServiceIntegrationTest.java b/src/test/java/hdm/mi/growbros/service/PlantsServiceIntegrationTest.java index b67724a08b4a083c7c2eb8a9ee40ea874741a88d..8538b5828a894e0104f25afa35b79f1907a2a2d6 100644 --- a/src/test/java/hdm/mi/growbros/service/PlantsServiceIntegrationTest.java +++ b/src/test/java/hdm/mi/growbros/service/PlantsServiceIntegrationTest.java @@ -7,8 +7,14 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ActiveProfiles; +import java.util.List; + import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest @@ -29,6 +35,9 @@ class PlantsServiceIntegrationTest { @Test void canUpdatePlant() { + Authentication authentication = new UsernamePasswordAuthenticationToken("admin", "password", List.of(new SimpleGrantedAuthority("ADMIN"))); + SecurityContextHolder.getContext().setAuthentication(authentication); + System.out.println("set mock security context"); String newName = "new name!"; plantsService.updatePlant(plant.getId(), PlantUpdateRequest.builder().name(newName).build()); assertEquals(newName, plantRepository.findById(plant.getId()).get().getName());