Skip to content
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
Expand Up @@ -5,9 +5,11 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand Down Expand Up @@ -46,4 +48,20 @@ public DriverResponseDTO getDriverByLicenseNumber(@PathVariable String licenseNu
public List<DriverResponseDTO> getAllDrivers() {
return driverService.getAllDrivers();
}

@PutMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<DriverResponseDTO> updateDriver(@PathVariable Long id, @Valid @RequestBody DriverRequestDTO request) {
return driverService.updateDriver(id, request)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.badRequest().build());
}

@DeleteMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<Void> deleteDriver(@PathVariable Long id) {
return driverService.deleteDriver(id)
? ResponseEntity.noContent().build()
: ResponseEntity.badRequest().build();
}
Comment thread
StoynovAngel marked this conversation as resolved.
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.angel.autonow.vehicle.VehicleEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Named;

import java.util.Collections;
Expand All @@ -19,6 +20,10 @@ public interface DriverMapper {
@Mapping(target = "vehicles", ignore = true)
DriverEntity toEntity(DriverRequestDTO request);

@Mapping(target = "id", ignore = true)
@Mapping(target = "vehicles", ignore = true)
void updateEntity(DriverRequestDTO request, @MappingTarget DriverEntity entity);

@Named("vehiclesToIds")
default Set<Long> vehiclesToIds(Set<VehicleEntity> vehicles) {
if (vehicles == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Builder;

@Builder
public record DriverRequestDTO(

@NotBlank(message = "First name is required")
Expand Down
19 changes: 19 additions & 0 deletions backend/src/main/java/com/angel/autonow/driver/DriverService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
Expand Down Expand Up @@ -32,4 +33,22 @@ public List<DriverResponseDTO> getAllDrivers() {
.map(driverMapper::toDTO)
.toList();
}

@Transactional
public Optional<DriverResponseDTO> updateDriver(Long id, DriverRequestDTO request) {
return driverRepository.findById(id).map(driver -> {
driverMapper.updateEntity(request, driver);
return driverMapper.toDTO(driverRepository.save(driver));
});
}

public boolean deleteDriver(Long id) {
if (!driverRepository.existsById(id)) {
return false;
}

driverRepository.deleteById(id);

return true;
Comment thread
StoynovAngel marked this conversation as resolved.
}
}
18 changes: 18 additions & 0 deletions backend/src/main/java/com/angel/autonow/order/OrderController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand Down Expand Up @@ -46,4 +48,20 @@ public List<OrderResponseDTO> getOrdersByUserId(@PathVariable Long userId) {
public List<OrderResponseDTO> getAllOrders() {
return orderService.getAllOrders();
}

@PutMapping("/{id}")
@PreAuthorize("hasAnyRole('ADMIN', 'CUSTOMER')")
public ResponseEntity<OrderResponseDTO> updateOrder(@PathVariable Long id, @Valid @RequestBody OrderRequestDTO request) {
return orderService.updateOrder(id, request)
Comment thread
StoynovAngel marked this conversation as resolved.
.map(ResponseEntity::ok)
.orElse(ResponseEntity.badRequest().build());
}

@DeleteMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<Void> deleteOrder(@PathVariable Long id) {
return orderService.deleteOrder(id)
? ResponseEntity.noContent().build()
: ResponseEntity.badRequest().build();
}
}
12 changes: 12 additions & 0 deletions backend/src/main/java/com/angel/autonow/order/OrderMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;

@Mapper(componentModel = "spring")
public interface OrderMapper {
Expand All @@ -21,4 +22,15 @@ public interface OrderMapper {
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
OrderEntity toEntity(OrderRequestDTO request);

@Mapping(target = "id", ignore = true)
@Mapping(target = "user", ignore = true)
@Mapping(target = "driver", ignore = true)
@Mapping(target = "vehicle", ignore = true)
@Mapping(target = "status", ignore = true)
@Mapping(target = "finalPrice", ignore = true)
@Mapping(target = "cancellationReason", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
void updateEntity(OrderRequestDTO request, @MappingTarget OrderEntity entity);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.Builder;

@Builder
public record OrderRequestDTO(

@NotNull(message = "User ID is required")
Expand Down
56 changes: 56 additions & 0 deletions backend/src/main/java/com/angel/autonow/order/OrderService.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.angel.autonow.order;

import com.angel.autonow.driver.DriverEntity;
import com.angel.autonow.driver.DriverRepository;
import com.angel.autonow.user.UserEntity;
import com.angel.autonow.user.UserRepository;
import com.angel.autonow.vehicle.VehicleEntity;
import com.angel.autonow.vehicle.VehicleRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -72,4 +74,58 @@ public List<OrderResponseDTO> getAllOrders() {
.map(orderMapper::toDTO)
.toList();
}

@Transactional
public Optional<OrderResponseDTO> updateOrder(Long id, OrderRequestDTO request) {
Optional<OrderEntity> existing = orderRepository.findById(id);

if (existing.isEmpty()) {
return Optional.empty();
}

Optional<UserEntity> user = userRepository.findById(request.userId());
if (user.isEmpty()) {
return Optional.empty();
}

DriverEntity driver = null;
if (request.driverId() != null) {
var driverOpt = driverRepository.findById(request.driverId());

if (driverOpt.isEmpty()) {
return Optional.empty();
}

driver = driverOpt.get();
}

VehicleEntity vehicle = null;
if (request.vehicleId() != null) {
var vehicleOpt = vehicleRepository.findById(request.vehicleId());

if (vehicleOpt.isEmpty()) {
return Optional.empty();
}

vehicle = vehicleOpt.get();
}

OrderEntity order = existing.get();
orderMapper.updateEntity(request, order);
order.setUser(user.get());
order.setDriver(driver);
order.setVehicle(vehicle);

return Optional.of(orderMapper.toDTO(orderRepository.save(order)));
}

public boolean deleteOrder(Long id) {
if (!orderRepository.existsById(id)) {
return false;
}

orderRepository.deleteById(id);
Comment thread
StoynovAngel marked this conversation as resolved.

return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand Down Expand Up @@ -46,4 +48,20 @@ public PaymentResponseDTO getPaymentByOrderId(@PathVariable Long orderId) {
public List<PaymentResponseDTO> getAllPayments() {
return paymentService.getAllPayments();
}

@PutMapping("/{id}")
@PreAuthorize("hasAnyRole('ADMIN', 'CUSTOMER')")
public ResponseEntity<PaymentResponseDTO> updatePayment(@PathVariable Long id, @Valid @RequestBody PaymentRequestDTO request) {
return paymentService.updatePayment(id, request)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.badRequest().build());
Comment thread
StoynovAngel marked this conversation as resolved.
}

@DeleteMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<Void> deletePayment(@PathVariable Long id) {
return paymentService.deletePayment(id)
? ResponseEntity.noContent().build()
: ResponseEntity.badRequest().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;

@Mapper(componentModel = "spring")
public interface PaymentMapper {
Expand All @@ -15,4 +16,11 @@ public interface PaymentMapper {
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
PaymentEntity toEntity(PaymentRequestDTO request);

@Mapping(target = "id", ignore = true)
@Mapping(target = "order", ignore = true)
@Mapping(target = "status", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
void updateEntity(PaymentRequestDTO request, @MappingTarget PaymentEntity entity);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.Builder;

@Builder
public record PaymentRequestDTO(

@NotNull(message = "Order ID is required")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,45 @@ public List<PaymentResponseDTO> getAllPayments() {
.map(paymentMapper::toDTO)
.toList();
}

@Transactional
public Optional<PaymentResponseDTO> updatePayment(Long id, PaymentRequestDTO request) {
Optional<PaymentEntity> existing = paymentRepository.findById(id);

if (existing.isEmpty()) {
return Optional.empty();
}

PaymentEntity payment = existing.get();

if (!payment.getOrder().getId().equals(request.orderId())) {
boolean orderAlreadyPaid = paymentRepository.findByOrderId(request.orderId())
.filter(p -> !p.getId().equals(payment.getId()))
.isPresent();

if (orderAlreadyPaid) {
return Optional.empty();
}

Optional<OrderEntity> order = orderRepository.findById(request.orderId());
if (order.isEmpty()) {
return Optional.empty();
}
payment.setOrder(order.get());
}
Comment thread
StoynovAngel marked this conversation as resolved.

paymentMapper.updateEntity(request, payment);

return Optional.of(paymentMapper.toDTO(paymentRepository.save(payment)));
}

public boolean deletePayment(Long id) {
if (!paymentRepository.existsById(id)) {
return false;
}

paymentRepository.deleteById(id);

Comment thread
StoynovAngel marked this conversation as resolved.
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand Down Expand Up @@ -46,4 +48,20 @@ public RatingResponseDTO getRatingByOrderId(@PathVariable Long orderId) {
public List<RatingResponseDTO> getAllRatings() {
return ratingService.getAllRatings();
}

@PutMapping("/{id}")
@PreAuthorize("hasAnyRole('ADMIN', 'CUSTOMER')")
public ResponseEntity<RatingResponseDTO> updateRating(@PathVariable Long id, @Valid @RequestBody RatingRequestDTO request) {
return ratingService.updateRating(id, request)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.badRequest().build());
}

@DeleteMapping("/{id}")
@PreAuthorize("hasAnyRole('ADMIN', 'CUSTOMER')")
public ResponseEntity<Void> deleteRating(@PathVariable Long id) {
return ratingService.deleteRating(id)
? ResponseEntity.noContent().build()
: ResponseEntity.badRequest().build();
Comment thread
StoynovAngel marked this conversation as resolved.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;

@Mapper(componentModel = "spring")
public interface RatingMapper {
Expand All @@ -13,4 +14,9 @@ public interface RatingMapper {
@Mapping(target = "order", ignore = true)
@Mapping(target = "createdAt", ignore = true)
RatingEntity toEntity(RatingRequestDTO request);

@Mapping(target = "id", ignore = true)
@Mapping(target = "order", ignore = true)
@Mapping(target = "createdAt", ignore = true)
void updateEntity(RatingRequestDTO request, @MappingTarget RatingEntity entity);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Builder;

@Builder
public record RatingRequestDTO(

@NotNull(message = "Order ID is required")
Expand Down
Loading
Loading