From 8866780de8b85c0df05c48356da12df48dab2db0 Mon Sep 17 00:00:00 2001 From: lica200 Date: Fri, 17 May 2024 22:49:49 +0200 Subject: [PATCH 1/3] BE-#96: Fahrgemeinschaft init ohne Tests --- .../adapter/in/CarpoolWidgetController.java | 49 +++++++++++++ .../application/CarpoolWidgetService.java | 69 +++++++++++++++++++ .../mapper/CarpoolWidgetMapper.java | 25 +++++++ .../model/carpool/CarpoolCreateCommand.java | 14 ++++ .../widget/model/carpool/CarpoolWidget.java | 43 ++++++++++++ .../backend/widget/model/carpool/Rider.java | 15 ++++ .../widget/model/carpool/RiderAddCommand.java | 14 ++++ .../application/CarpoolWidetServiceTest.java | 49 +++++++++++++ 8 files changed, 278 insertions(+) create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/CarpoolWidgetController.java create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/application/mapper/CarpoolWidgetMapper.java create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolCreateCommand.java create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolWidget.java create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Rider.java create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/RiderAddCommand.java create mode 100644 backend/src/test/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidetServiceTest.java diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/CarpoolWidgetController.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/CarpoolWidgetController.java new file mode 100644 index 0000000..04a9547 --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/CarpoolWidgetController.java @@ -0,0 +1,49 @@ +package com.dhbw.get2gether.backend.widget.adapter.in; + +import com.dhbw.get2gether.backend.event.model.Event; +import com.dhbw.get2gether.backend.widget.application.CarpoolWidgetService; +import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolCreateCommand; +import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolWidget; +import com.dhbw.get2gether.backend.widget.model.carpool.RiderAddCommand; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/event/{eventId}/widgets/carpool") +public class CarpoolWidgetController { + + public CarpoolWidgetService service; + + public CarpoolWidgetController (CarpoolWidgetService service){ + this.service = service; + } + + @PostMapping("/") + public Event createCarpoolWidget( + @AuthenticationPrincipal OAuth2User principal, + @PathVariable String eventId, + @RequestBody CarpoolCreateCommand createCommand + ) { + return service.createCarpoolWidget(principal, eventId, createCommand); + } + @PostMapping("/{widgetId}/entries") + public CarpoolWidget addRider( + @AuthenticationPrincipal OAuth2User principal, + @PathVariable String eventId, + @PathVariable String widgetId, + @RequestBody RiderAddCommand addCommand + ) { + return service.addRider(principal, eventId, widgetId, addCommand); + } + @DeleteMapping("/{widgetId}/riders/{riderId}") + public CarpoolWidget removeRider( + @AuthenticationPrincipal OAuth2User principal, + @PathVariable String eventId, + @PathVariable String widgetId, + @PathVariable String riderId + ) { + return service.removeRider(principal, eventId, widgetId, riderId); + } + +} diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java new file mode 100644 index 0000000..1bc9afa --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java @@ -0,0 +1,69 @@ +package com.dhbw.get2gether.backend.widget.application; + +import com.dhbw.get2gether.backend.event.application.EventService; +import com.dhbw.get2gether.backend.event.model.Event; +import com.dhbw.get2gether.backend.exceptions.EntityNotFoundException; +import com.dhbw.get2gether.backend.user.application.UserService; +import com.dhbw.get2gether.backend.widget.application.mapper.CarpoolWidgetMapper; +import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolCreateCommand; +import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolWidget; +import com.dhbw.get2gether.backend.widget.model.carpool.Rider; +import com.dhbw.get2gether.backend.widget.model.carpool.RiderAddCommand; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.AuthenticatedPrincipal; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Objects; +import java.util.UUID; + +@Service +public class CarpoolWidgetService extends AbstractWidgetService{ + + private final CarpoolWidgetMapper mapper; + private final UserService userService; + + CarpoolWidgetService(EventService eventService, CarpoolWidgetMapper mapper, UserService userService) { + super(eventService); + this.mapper = mapper; + this.userService = userService; + } + + @PreAuthorize("hasRole('USER')") + public Event createCarpoolWidget(AuthenticatedPrincipal principal, String eventId, CarpoolCreateCommand createCommand) { + Event event = getEventById(principal, eventId); + CarpoolWidget widget = mapper.mapToCarpoolWidget(createCommand).toBuilder() + .id(UUID.randomUUID().toString()) + .creationDate(LocalDateTime.now()) + .driverAdress(mapper.mapToLocation(createCommand.getDriverAdress())) + .build(); + return addWidget(principal, event, widget); + } + + @PreAuthorize("hasRole('USER')") + public CarpoolWidget addRider(AuthenticatedPrincipal principal, String eventId, String widgetId, RiderAddCommand addCommand) { + Event event = getEventById(principal, eventId); + CarpoolWidget widget = getWidgetFromEvent(event, widgetId); + Rider rider = mapper.mapToRider(addCommand).toBuilder() + .id(UUID.randomUUID().toString()) + .userId(userService.getUserByPrincipal(principal).getId()) + .pickupPlace(mapper.mapToLocation(addCommand.getPickupPlace())) + .build(); + + widget.addRider(rider); + return updateAndGetWidget(principal, event, widget); + } + @PreAuthorize("hasRole('USER')") + public CarpoolWidget removeRider(AuthenticatedPrincipal principal, String eventId, String widgetId, String riderId) { + Event event = getEventById(principal, eventId); + CarpoolWidget widget = getWidgetFromEvent(event, widgetId); + Rider rider = widget.getRiders().stream() + .filter(r -> Objects.equals(r.getId(), riderId)).findFirst() + .orElseThrow(() -> new EntityNotFoundException("Rider not found")); + if (!widget.removeRider(rider)) { + throw new IllegalStateException("Failed to remove rider from shopping list widget"); + } + return updateAndGetWidget(principal, event, widget); + } + +} diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/mapper/CarpoolWidgetMapper.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/mapper/CarpoolWidgetMapper.java new file mode 100644 index 0000000..036e467 --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/mapper/CarpoolWidgetMapper.java @@ -0,0 +1,25 @@ +package com.dhbw.get2gether.backend.widget.application.mapper; + +import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolCreateCommand; +import com.dhbw.get2gether.backend.widget.model.carpool.Rider; +import com.dhbw.get2gether.backend.widget.model.carpool.RiderAddCommand; +import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolWidget; +import com.dhbw.get2gether.backend.widget.model.map.Location; +import com.dhbw.get2gether.backend.widget.model.map.LocationAddCommand; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface CarpoolWidgetMapper { + @Mapping(target = "id", ignore = true) + @Mapping(target = "creationDate", ignore = true) + @Mapping(target = "driverId", ignore = true) + CarpoolWidget mapToCarpoolWidget(CarpoolCreateCommand createCommand); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "userId", ignore = true) + Rider mapToRider(RiderAddCommand command); + + @Mapping(target = "id", ignore = true) + Location mapToLocation(LocationAddCommand command); +} diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolCreateCommand.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolCreateCommand.java new file mode 100644 index 0000000..01a6536 --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolCreateCommand.java @@ -0,0 +1,14 @@ +package com.dhbw.get2gether.backend.widget.model.carpool; + +import com.dhbw.get2gether.backend.widget.model.map.Location; +import com.dhbw.get2gether.backend.widget.model.map.LocationAddCommand; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CarpoolCreateCommand { + private LocationAddCommand driverAdress; + private int anzahlPlaetze; + private String[] riderIds; +} diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolWidget.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolWidget.java new file mode 100644 index 0000000..30bb04a --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolWidget.java @@ -0,0 +1,43 @@ +package com.dhbw.get2gether.backend.widget.model.carpool; + +import com.dhbw.get2gether.backend.widget.model.Widget; +import com.dhbw.get2gether.backend.widget.model.WidgetType; +import com.dhbw.get2gether.backend.widget.model.map.Location; +import com.dhbw.get2gether.backend.widget.model.shoppinglist.Entry; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Builder(toBuilder = true) +@Getter +@AllArgsConstructor +public class CarpoolWidget extends Widget { + private String id; + private final LocalDateTime creationDate; + private String driverId; + private Location driverAdress; + private int anzahlPlaetze; + @Builder.Default + private List riders = new ArrayList<>(); + + @Override + public LocalDateTime getCreationDate() { + return creationDate; + } + + @Override + public WidgetType getWidgetType() { + return WidgetType.CARPOOL; + } + public void addRider(Rider rider) { + riders.add(rider); + } + + public boolean removeRider(Rider rider) { + return riders.remove(rider); + } +} diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Rider.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Rider.java new file mode 100644 index 0000000..9ee9087 --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Rider.java @@ -0,0 +1,15 @@ +package com.dhbw.get2gether.backend.widget.model.carpool; + +import com.dhbw.get2gether.backend.widget.model.map.Location; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Builder(toBuilder = true) +@Getter +@AllArgsConstructor +public class Rider { + private final String id; + private final String userId; + private final Location pickupPlace; +} diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/RiderAddCommand.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/RiderAddCommand.java new file mode 100644 index 0000000..10b7080 --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/RiderAddCommand.java @@ -0,0 +1,14 @@ +package com.dhbw.get2gether.backend.widget.model.carpool; + +import com.dhbw.get2gether.backend.widget.model.map.Location; +import com.dhbw.get2gether.backend.widget.model.map.LocationAddCommand; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Builder(toBuilder = true) +@Getter +@AllArgsConstructor +public class RiderAddCommand { + private final LocationAddCommand pickupPlace; +} diff --git a/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidetServiceTest.java b/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidetServiceTest.java new file mode 100644 index 0000000..28045c2 --- /dev/null +++ b/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidetServiceTest.java @@ -0,0 +1,49 @@ +package com.dhbw.get2gether.backend.widget.application; + +import com.dhbw.get2gether.backend.AbstractIntegrationTest; +import com.dhbw.get2gether.backend.event.application.EventService; +import com.dhbw.get2gether.backend.user.application.UserService; +import com.dhbw.get2gether.backend.utils.WithMockGuestUser; +import com.dhbw.get2gether.backend.utils.WithMockOAuth2User; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +public class CarpoolWidetServiceTest extends AbstractIntegrationTest { + @MockBean + private EventService eventService; + @MockBean + private UserService userService; + @MockBean + private CarpoolWidgetService carpoolWidgetService; + + @Test + @WithMockOAuth2User + void shouldCreateWidget(){ + + } + @Test + @WithMockOAuth2User + void shouldNotCreateWidgetIfAlreadyExists() { + + } + @Test + @WithMockGuestUser + void shouldNotCreateWidgetIfUserIsGuest() { + + } + @Test + @WithMockOAuth2User + void shouldAddRider() { + + } + @Test + @WithMockGuestUser + void shouldNotAddRiderIfUserIsGuest() { + + } + @Test + @WithMockOAuth2User + void shouldRemoveRider() { + + } +} From ba80bcc540b731bdf854ec1554325e61bebf5250 Mon Sep 17 00:00:00 2001 From: lica200 Date: Wed, 22 May 2024 13:00:55 +0200 Subject: [PATCH 2/3] =?UTF-8?q?BE-#96:=20Fahrgemeinschaft=20Cars=20hinzuge?= =?UTF-8?q?f=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/in/CarpoolWidgetController.java | 29 +- .../application/CarpoolWidgetService.java | 51 +++- .../mapper/CarpoolWidgetMapper.java | 17 +- .../backend/widget/model/carpool/Car.java | 28 ++ .../widget/model/carpool/CarAddCommand.java | 14 + .../model/carpool/CarpoolCreateCommand.java | 5 +- .../widget/model/carpool/CarpoolWidget.java | 15 +- .../backend/widget/model/carpool/Rider.java | 2 +- .../widget/model/carpool/RiderAddCommand.java | 2 +- .../application/CarpoolWidetServiceTest.java | 279 +++++++++++++++++- 10 files changed, 399 insertions(+), 43 deletions(-) create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Car.java create mode 100644 backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarAddCommand.java diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/CarpoolWidgetController.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/CarpoolWidgetController.java index 04a9547..1f19a30 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/CarpoolWidgetController.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/adapter/in/CarpoolWidgetController.java @@ -2,6 +2,7 @@ import com.dhbw.get2gether.backend.event.model.Event; import com.dhbw.get2gether.backend.widget.application.CarpoolWidgetService; +import com.dhbw.get2gether.backend.widget.model.carpool.CarAddCommand; import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolCreateCommand; import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolWidget; import com.dhbw.get2gether.backend.widget.model.carpool.RiderAddCommand; @@ -27,23 +28,43 @@ public Event createCarpoolWidget( ) { return service.createCarpoolWidget(principal, eventId, createCommand); } - @PostMapping("/{widgetId}/entries") + @PostMapping("/{widgetId}/cars") + public CarpoolWidget addCar( + @AuthenticationPrincipal OAuth2User principal, + @PathVariable String eventId, + @PathVariable String widgetId, + @RequestBody CarAddCommand addCommand + ) { + return service.addCar(principal, eventId, widgetId, addCommand); + } + @DeleteMapping("/{widgetId}/cars/{carId}") + public CarpoolWidget removeCar( + @AuthenticationPrincipal OAuth2User principal, + @PathVariable String eventId, + @PathVariable String widgetId, + @PathVariable String carId + ) { + return service.removeCar(principal, eventId, widgetId, carId); + } + @PostMapping("/{widgetId}/cars/{carId}") public CarpoolWidget addRider( @AuthenticationPrincipal OAuth2User principal, @PathVariable String eventId, @PathVariable String widgetId, + @PathVariable String carId, @RequestBody RiderAddCommand addCommand ) { - return service.addRider(principal, eventId, widgetId, addCommand); + return service.addRider(principal, eventId, widgetId,carId, addCommand); } - @DeleteMapping("/{widgetId}/riders/{riderId}") + @DeleteMapping("/{widgetId}/cars/{carId}/riders/{riderId}") public CarpoolWidget removeRider( @AuthenticationPrincipal OAuth2User principal, @PathVariable String eventId, @PathVariable String widgetId, + @PathVariable String carId, @PathVariable String riderId ) { - return service.removeRider(principal, eventId, widgetId, riderId); + return service.removeRider(principal, eventId, widgetId, carId, riderId); } } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java index 1bc9afa..c0165cc 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java @@ -5,10 +5,7 @@ import com.dhbw.get2gether.backend.exceptions.EntityNotFoundException; import com.dhbw.get2gether.backend.user.application.UserService; import com.dhbw.get2gether.backend.widget.application.mapper.CarpoolWidgetMapper; -import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolCreateCommand; -import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolWidget; -import com.dhbw.get2gether.backend.widget.model.carpool.Rider; -import com.dhbw.get2gether.backend.widget.model.carpool.RiderAddCommand; +import com.dhbw.get2gether.backend.widget.model.carpool.*; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.AuthenticatedPrincipal; import org.springframework.stereotype.Service; @@ -35,33 +32,61 @@ public Event createCarpoolWidget(AuthenticatedPrincipal principal, String eventI CarpoolWidget widget = mapper.mapToCarpoolWidget(createCommand).toBuilder() .id(UUID.randomUUID().toString()) .creationDate(LocalDateTime.now()) - .driverAdress(mapper.mapToLocation(createCommand.getDriverAdress())) .build(); return addWidget(principal, event, widget); } @PreAuthorize("hasRole('USER')") - public CarpoolWidget addRider(AuthenticatedPrincipal principal, String eventId, String widgetId, RiderAddCommand addCommand) { + public CarpoolWidget addCar(AuthenticatedPrincipal principal, String eventId, String widgetId, CarAddCommand addCommand) { Event event = getEventById(principal, eventId); CarpoolWidget widget = getWidgetFromEvent(event, widgetId); + Car car = mapper.mapToCar(addCommand).toBuilder() + .id(UUID.randomUUID().toString()) + .driverId(userService.getUserByPrincipal(principal).getId()) + .build(); + + widget.addCar(car); + return updateAndGetWidget(principal, event, widget); + } + @PreAuthorize("hasRole('USER')") + public CarpoolWidget removeCar(AuthenticatedPrincipal principal, String eventId, String widgetId, String carId) { + Event event = getEventById(principal, eventId); + CarpoolWidget widget = getWidgetFromEvent(event, widgetId); + Car car = widget.getCars().stream() + .filter(c -> Objects.equals(c.getId(), carId)).findFirst() + .orElseThrow(() -> new EntityNotFoundException("Car not found")); + if (!widget.removeCar(car)) { + throw new IllegalStateException("Failed to remove Car from Carpool widget"); + } + return updateAndGetWidget(principal, event, widget); + } + @PreAuthorize("hasRole('USER')") + public CarpoolWidget addRider(AuthenticatedPrincipal principal, String eventId, String widgetId, String carId, RiderAddCommand addCommand) { + Event event = getEventById(principal, eventId); + CarpoolWidget widget = getWidgetFromEvent(event, widgetId); + Car car = widget.getCars().stream() + .filter(c -> Objects.equals(c.getId(), carId)).findFirst() + .orElseThrow(() -> new EntityNotFoundException("Car not found")); Rider rider = mapper.mapToRider(addCommand).toBuilder() .id(UUID.randomUUID().toString()) .userId(userService.getUserByPrincipal(principal).getId()) - .pickupPlace(mapper.mapToLocation(addCommand.getPickupPlace())) .build(); - - widget.addRider(rider); + car.addRider(rider); + widget.addCar(car); return updateAndGetWidget(principal, event, widget); } @PreAuthorize("hasRole('USER')") - public CarpoolWidget removeRider(AuthenticatedPrincipal principal, String eventId, String widgetId, String riderId) { + public CarpoolWidget removeRider(AuthenticatedPrincipal principal, String eventId, String widgetId, String carId, String riderId) { Event event = getEventById(principal, eventId); CarpoolWidget widget = getWidgetFromEvent(event, widgetId); - Rider rider = widget.getRiders().stream() + Car car = widget.getCars().stream() + .filter(c -> Objects.equals(c.getId(), carId)).findFirst() + .orElseThrow(() -> new EntityNotFoundException("Car not found")); + Rider rider = car.getRiders().stream() .filter(r -> Objects.equals(r.getId(), riderId)).findFirst() .orElseThrow(() -> new EntityNotFoundException("Rider not found")); - if (!widget.removeRider(rider)) { - throw new IllegalStateException("Failed to remove rider from shopping list widget"); + if (!car.removeRider(rider)) { + throw new IllegalStateException("Failed to remove rider from car"); } return updateAndGetWidget(principal, event, widget); } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/mapper/CarpoolWidgetMapper.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/mapper/CarpoolWidgetMapper.java index 036e467..00ee919 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/mapper/CarpoolWidgetMapper.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/mapper/CarpoolWidgetMapper.java @@ -1,11 +1,6 @@ package com.dhbw.get2gether.backend.widget.application.mapper; -import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolCreateCommand; -import com.dhbw.get2gether.backend.widget.model.carpool.Rider; -import com.dhbw.get2gether.backend.widget.model.carpool.RiderAddCommand; -import com.dhbw.get2gether.backend.widget.model.carpool.CarpoolWidget; -import com.dhbw.get2gether.backend.widget.model.map.Location; -import com.dhbw.get2gether.backend.widget.model.map.LocationAddCommand; +import com.dhbw.get2gether.backend.widget.model.carpool.*; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -13,13 +8,15 @@ public interface CarpoolWidgetMapper { @Mapping(target = "id", ignore = true) @Mapping(target = "creationDate", ignore = true) - @Mapping(target = "driverId", ignore = true) + @Mapping(target = "cars", ignore = true) CarpoolWidget mapToCarpoolWidget(CarpoolCreateCommand createCommand); @Mapping(target = "id", ignore = true) - @Mapping(target = "userId", ignore = true) - Rider mapToRider(RiderAddCommand command); + @Mapping(target = "driverId", ignore = true) + @Mapping(target = "riders", ignore = true) + Car mapToCar(CarAddCommand command); @Mapping(target = "id", ignore = true) - Location mapToLocation(LocationAddCommand command); + @Mapping(target = "userId", ignore = true) + Rider mapToRider(RiderAddCommand command); } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Car.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Car.java new file mode 100644 index 0000000..efe3ac4 --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Car.java @@ -0,0 +1,28 @@ +package com.dhbw.get2gether.backend.widget.model.carpool; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Builder(toBuilder = true) +@Getter +@AllArgsConstructor +public class Car { + private String id; + private String driverId; + private String driverAdress; + private int anzahlPlaetze; + @Builder.Default + private List riders = new ArrayList<>(); + + public void addRider(Rider rider) { + riders.add(rider); + } + + public boolean removeRider(Rider rider) { + return riders.remove(rider); + } +} diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarAddCommand.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarAddCommand.java new file mode 100644 index 0000000..db231b4 --- /dev/null +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarAddCommand.java @@ -0,0 +1,14 @@ +package com.dhbw.get2gether.backend.widget.model.carpool; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@AllArgsConstructor +@Builder(toBuilder = true) +public class CarAddCommand { + private String driverAdress; + private int anzahlPlaetze; +} diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolCreateCommand.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolCreateCommand.java index 01a6536..0f928f2 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolCreateCommand.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolCreateCommand.java @@ -3,12 +3,11 @@ import com.dhbw.get2gether.backend.widget.model.map.Location; import com.dhbw.get2gether.backend.widget.model.map.LocationAddCommand; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter @AllArgsConstructor +@Builder(toBuilder = true) public class CarpoolCreateCommand { - private LocationAddCommand driverAdress; - private int anzahlPlaetze; - private String[] riderIds; } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolWidget.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolWidget.java index 30bb04a..cea6364 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolWidget.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/CarpoolWidget.java @@ -2,8 +2,6 @@ import com.dhbw.get2gether.backend.widget.model.Widget; import com.dhbw.get2gether.backend.widget.model.WidgetType; -import com.dhbw.get2gether.backend.widget.model.map.Location; -import com.dhbw.get2gether.backend.widget.model.shoppinglist.Entry; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -18,11 +16,8 @@ public class CarpoolWidget extends Widget { private String id; private final LocalDateTime creationDate; - private String driverId; - private Location driverAdress; - private int anzahlPlaetze; @Builder.Default - private List riders = new ArrayList<>(); + private List cars = new ArrayList<>(); @Override public LocalDateTime getCreationDate() { @@ -33,11 +28,11 @@ public LocalDateTime getCreationDate() { public WidgetType getWidgetType() { return WidgetType.CARPOOL; } - public void addRider(Rider rider) { - riders.add(rider); + public void addCar(Car car) { + cars.add(car); } - public boolean removeRider(Rider rider) { - return riders.remove(rider); + public boolean removeCar(Car car) { + return cars.remove(car); } } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Rider.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Rider.java index 9ee9087..797d1be 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Rider.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/Rider.java @@ -11,5 +11,5 @@ public class Rider { private final String id; private final String userId; - private final Location pickupPlace; + private final String pickupPlace; } diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/RiderAddCommand.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/RiderAddCommand.java index 10b7080..f324581 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/RiderAddCommand.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/model/carpool/RiderAddCommand.java @@ -10,5 +10,5 @@ @Getter @AllArgsConstructor public class RiderAddCommand { - private final LocationAddCommand pickupPlace; + private final String pickupPlace; } diff --git a/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidetServiceTest.java b/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidetServiceTest.java index 28045c2..b426da2 100644 --- a/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidetServiceTest.java +++ b/backend/src/test/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidetServiceTest.java @@ -2,48 +2,325 @@ import com.dhbw.get2gether.backend.AbstractIntegrationTest; import com.dhbw.get2gether.backend.event.application.EventService; +import com.dhbw.get2gether.backend.event.model.Event; +import com.dhbw.get2gether.backend.event.model.EventWidgetUpdateCommand; +import com.dhbw.get2gether.backend.exceptions.OperationNotAllowedException; import com.dhbw.get2gether.backend.user.application.UserService; +import com.dhbw.get2gether.backend.user.model.User; import com.dhbw.get2gether.backend.utils.WithMockGuestUser; import com.dhbw.get2gether.backend.utils.WithMockOAuth2User; +import com.dhbw.get2gether.backend.widget.model.carpool.*; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.AuthenticatedPrincipal; +import org.springframework.security.core.context.SecurityContextHolder; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; public class CarpoolWidetServiceTest extends AbstractIntegrationTest { @MockBean private EventService eventService; @MockBean private UserService userService; - @MockBean + @Autowired private CarpoolWidgetService carpoolWidgetService; @Test @WithMockOAuth2User void shouldCreateWidget(){ + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Event event = Event.builder() + .id("123") + .widgets(new ArrayList<>()) + .build(); + CarpoolCreateCommand createCommand = new CarpoolCreateCommand(); + + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + when(eventService.updateEventWidgets(any(), eq(event.getId()), any())) + .thenAnswer(i -> event.toBuilder() + .widgets( + i.getArgument(2, EventWidgetUpdateCommand.class).getWidgets() + ) + .build() + ); + String eventId = event.getId(); + // when + Event returnedEvent = carpoolWidgetService.createCarpoolWidget(principal, event.getId(), createCommand); + // then + assertThat(returnedEvent).isNotNull(); + assertThat(returnedEvent.getWidgets()).hasSize(1); + assertThat(returnedEvent.getWidgets().get(0)).isInstanceOf(CarpoolWidget.class).hasNoNullFieldsOrProperties(); } @Test @WithMockOAuth2User void shouldNotCreateWidgetIfAlreadyExists() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Event event = Event.builder() + .id("123") + .widgets(Collections.singletonList(CarpoolWidget.builder().id("123").build())) + .build(); + CarpoolCreateCommand createCommand = new CarpoolCreateCommand(); + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + + // when + // then + assertThatThrownBy(() -> carpoolWidgetService.createCarpoolWidget(principal, event.getId(), createCommand)) + .isInstanceOf(OperationNotAllowedException.class); } @Test @WithMockGuestUser void shouldNotCreateWidgetIfUserIsGuest() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Event event = Event.builder() + .id("123") + .widgets(new ArrayList<>()) + .build(); + CarpoolCreateCommand createCommand = new CarpoolCreateCommand(); + + // when + // then + assertThatThrownBy(() -> carpoolWidgetService.createCarpoolWidget(principal, event.getId(), createCommand)) + .isInstanceOf(AccessDeniedException.class); + } + @Test + @WithMockOAuth2User + void shouldAddCar() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + CarpoolWidget widget = CarpoolWidget.builder() + .id("wi-123") + .cars(new ArrayList<>()) + .build(); + Event event = Event.builder() + .id("ev-123") + .widgets(new ArrayList<>(List.of(widget))) + .build(); + CarAddCommand addCommand = CarAddCommand.builder() + .driverAdress("some Address") + .anzahlPlaetze(3) + .build(); + Car car = Car.builder() + .driverAdress("some Address") + .anzahlPlaetze(3) + .driverId("test") + .build(); + + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + when(eventService.updateEventWidgets(any(), eq(event.getId()), any())) + .thenAnswer(i -> event.toBuilder() + .widgets( + i.getArgument(2, EventWidgetUpdateCommand.class).getWidgets() + ) + .build() + ); + when(userService.getUserByPrincipal(principal)).thenReturn(User.builder() + .id("test") + .email("test@example.com").build()); + + // when + CarpoolWidget returnedWidget = carpoolWidgetService.addCar(principal, event.getId(), widget.getId(), addCommand); + + // then + assertThat(returnedWidget).isNotNull(); + assertThat(returnedWidget.getCars()).hasSize(1); + assertThat(returnedWidget.getCars().get(0)).usingRecursiveComparison() + .ignoringFields("id") + .isEqualTo(car); + assertThat(returnedWidget.getCars().get(0).getId()).isNotBlank(); + } + @Test + @WithMockGuestUser + void shouldNotAddCarIfUserIsGuest() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + CarpoolWidget widget = CarpoolWidget.builder() + .id("wi-123") + .cars(new ArrayList<>()) + .build(); + Event event = Event.builder() + .id("ev-123") + .widgets(new ArrayList<>(List.of(widget))) + .build(); + CarAddCommand addCommand = CarAddCommand.builder() + .driverAdress("some Address") + .anzahlPlaetze(3) + .build(); + + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + + // when + // then + assertThatThrownBy(() -> carpoolWidgetService.addCar(principal, event.getId(), widget.getId(), addCommand)) + .isInstanceOf(AccessDeniedException.class); + } + @Test + @WithMockOAuth2User + void shouldRemoveCar() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Car car = Car.builder() + .driverId("test") + .build(); + CarpoolWidget widget = CarpoolWidget.builder() + .id("wi-123") + .cars(new ArrayList<>(List.of(car))) + .build(); + Event event = Event.builder() + .id("ev-123") + .widgets(new ArrayList<>(List.of(widget))) + .build(); + + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + when(eventService.updateEventWidgets(any(), eq(event.getId()), any())) + .thenAnswer(i -> event.toBuilder() + .widgets( + i.getArgument(2, EventWidgetUpdateCommand.class).getWidgets() + ) + .build() + ); + // when + CarpoolWidget returnedWidget = carpoolWidgetService.removeCar(principal, event.getId(), widget.getId(), car.getId()); + + // then + assertThat(returnedWidget).isNotNull(); + assertThat(returnedWidget.getCars()).isEmpty(); } @Test @WithMockOAuth2User void shouldAddRider() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Car car = Car.builder() + .driverId("test") + .build(); + CarpoolWidget widget = CarpoolWidget.builder() + .id("wi-123") + .cars(new ArrayList<>(List.of(car))) + .build(); + Event event = Event.builder() + .id("ev-123") + .widgets(new ArrayList<>(List.of(widget))) + .build(); + RiderAddCommand addCommand = RiderAddCommand.builder() + .pickupPlace("Testpickup") + .build(); + Rider rider = Rider.builder() + .pickupPlace("Testpickup") + .userId("test") + .build(); + + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + when(eventService.updateEventWidgets(any(), eq(event.getId()), any())) + .thenAnswer(i -> event.toBuilder() + .widgets( + i.getArgument(2, EventWidgetUpdateCommand.class).getWidgets() + ) + .build() + ); + when(userService.getUserByPrincipal(principal)).thenReturn(User.builder() + .id("test") + .email("test@example.com").build()); + // when + CarpoolWidget returnedWidget = carpoolWidgetService.addRider(principal, event.getId(), widget.getId(), car.getId(), addCommand); + + // then + assertThat(returnedWidget).isNotNull(); + assertThat(returnedWidget.getCars().get(0).getRiders()).hasSize(1); + assertThat(returnedWidget.getCars().get(0).getRiders().get(0)).usingRecursiveComparison() + .ignoringFields("id") + .isEqualTo(rider); + assertThat(returnedWidget.getCars().get(0).getRiders().get(0).getId()).isNotBlank(); } @Test @WithMockGuestUser void shouldNotAddRiderIfUserIsGuest() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Car car = Car.builder() + .driverId("test") + .build(); + CarpoolWidget widget = CarpoolWidget.builder() + .id("wi-123") + .cars(new ArrayList<>(List.of(car))) + .build(); + Event event = Event.builder() + .id("ev-123") + .widgets(new ArrayList<>(List.of(widget))) + .build(); + RiderAddCommand addCommand = RiderAddCommand.builder() + .pickupPlace("Testpickup") + .build(); + + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + // when + // then + assertThatThrownBy(() -> carpoolWidgetService.addRider(principal, event.getId(), widget.getId(), car.getId(), addCommand)) + .isInstanceOf(AccessDeniedException.class); } @Test @WithMockOAuth2User void shouldRemoveRider() { + // given + AuthenticatedPrincipal principal = (AuthenticatedPrincipal) + SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Rider rider = Rider.builder() + .pickupPlace("Testpickup") + .userId("test") + .build(); + Car car = Car.builder() + .driverId("test") + .riders(new ArrayList<>(List.of(rider))) + .build(); + CarpoolWidget widget = CarpoolWidget.builder() + .id("wi-123") + .cars(new ArrayList<>(List.of(car))) + .build(); + Event event = Event.builder() + .id("ev-123") + .widgets(new ArrayList<>(List.of(widget))) + .build(); + + + when(eventService.getSingleEvent(any(), eq(event.getId()))).thenReturn(event); + when(eventService.updateEventWidgets(any(), eq(event.getId()), any())) + .thenAnswer(i -> event.toBuilder() + .widgets( + i.getArgument(2, EventWidgetUpdateCommand.class).getWidgets() + ) + .build() + ); + + // when + CarpoolWidget returnedWidget = carpoolWidgetService.removeRider(principal, event.getId(), widget.getId(), car.getId(), rider.getId()); + // then + assertThat(returnedWidget).isNotNull(); + assertThat(returnedWidget.getCars().get(0).getRiders()).isEmpty(); } } From fa763a026018da50d10d38ce0fd13a596426f3fe Mon Sep 17 00:00:00 2001 From: lica200 Date: Thu, 23 May 2024 09:35:33 +0200 Subject: [PATCH 3/3] BE-#96: BugFix --- .../backend/widget/application/CarpoolWidgetService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java index c0165cc..713662f 100644 --- a/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java +++ b/backend/src/main/java/com/dhbw/get2gether/backend/widget/application/CarpoolWidgetService.java @@ -72,7 +72,6 @@ public CarpoolWidget addRider(AuthenticatedPrincipal principal, String eventId, .userId(userService.getUserByPrincipal(principal).getId()) .build(); car.addRider(rider); - widget.addCar(car); return updateAndGetWidget(principal, event, widget); } @PreAuthorize("hasRole('USER')")