Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

feature/rating-service-integration #8

Open
wants to merge 10 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 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
29 changes: 28 additions & 1 deletion docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
name: Cab-aggregator
services:
redis:
image: "redis:alpine"
ports:
- "6379:6379"
- "6379:6379"

zookeeper:
image: bitnami/zookeeper:latest
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
ports:
- "2181:2181"
healthcheck:
test: [ "CMD", "echo", "ruok", "|", "nc", "localhost", "2181", "|", "grep", "imok" ]
interval: 10s
timeout: 5s
retries: 5

kafka:
image: bitnami/kafka:latest
ports:
- "9092:9092"
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=1
depends_on:
zookeeper:
condition: service_healthy
12 changes: 10 additions & 2 deletions driver-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>annotationProcessor</scope>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
Expand All @@ -67,6 +67,11 @@
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>${springdoc-openapi-starter-webmvc-api.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
Expand All @@ -78,7 +83,10 @@
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.vlad.kuzhyr.driverservice.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;

@Configuration
@EnableKafka
public class KafkaConfig {
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,15 @@ public class Driver {
@Column(name = "phone", nullable = false)
private String phone;

@Builder.Default
@OneToMany(mappedBy = "driver", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Car> cars = new ArrayList<>();

@Builder.Default
@Column(name = "is_enabled", nullable = false)
private Boolean isEnabled = Boolean.TRUE;

@Column(name = "is_busy", nullable = false)
@Builder.Default
private Boolean isBusy = Boolean.FALSE;

@Builder.Default
@OneToMany(mappedBy = "driver", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Car> cars = new ArrayList<>();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import com.vlad.kuzhyr.driverservice.persistence.entity.Driver;
import java.util.Optional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

Expand All @@ -16,6 +14,4 @@ public interface DriverRepository extends JpaRepository<Driver, Long> {

Boolean existsDriverByPhoneAndIsEnabledTrue(String driverRequestPhone);

Page<Driver> findByIsEnabledTrue(Pageable pageable);

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.vlad.kuzhyr.driverservice.service;

import com.vlad.kuzhyr.driverservice.web.request.CarRequest;
import com.vlad.kuzhyr.driverservice.web.response.CarResponse;
import com.vlad.kuzhyr.driverservice.web.response.PageResponse;
import com.vlad.kuzhyr.driverservice.web.dto.request.CarRequest;
import com.vlad.kuzhyr.driverservice.web.dto.response.CarResponse;
import com.vlad.kuzhyr.driverservice.web.dto.response.PageResponse;

public interface CarService {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.vlad.kuzhyr.driverservice.service;

import com.vlad.kuzhyr.driverservice.web.request.DriverRequest;
import com.vlad.kuzhyr.driverservice.web.request.DriverUpdateCarsRequest;
import com.vlad.kuzhyr.driverservice.web.response.DriverResponse;
import com.vlad.kuzhyr.driverservice.web.response.PageResponse;
import com.vlad.kuzhyr.driverservice.web.dto.request.DriverRequest;
import com.vlad.kuzhyr.driverservice.web.dto.request.DriverUpdateCarsRequest;
import com.vlad.kuzhyr.driverservice.web.dto.response.DriverResponse;
import com.vlad.kuzhyr.driverservice.web.dto.response.PageResponse;

public interface DriverService {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package com.vlad.kuzhyr.driverservice.service.impl;

import com.vlad.kuzhyr.driverservice.exception.CarAlreadyExistException;
import com.vlad.kuzhyr.driverservice.exception.CarNotFoundException;
import com.vlad.kuzhyr.driverservice.persistence.entity.Car;
import com.vlad.kuzhyr.driverservice.persistence.repository.CarRepository;
import com.vlad.kuzhyr.driverservice.service.CarService;
import com.vlad.kuzhyr.driverservice.utility.constant.ExceptionMessageConstant;
import com.vlad.kuzhyr.driverservice.utility.mapper.CarMapper;
import com.vlad.kuzhyr.driverservice.utility.mapper.PageResponseMapper;
import com.vlad.kuzhyr.driverservice.web.request.CarRequest;
import com.vlad.kuzhyr.driverservice.web.response.CarResponse;
import com.vlad.kuzhyr.driverservice.web.response.PageResponse;
import com.vlad.kuzhyr.driverservice.utility.validator.CarValidator;
import com.vlad.kuzhyr.driverservice.web.dto.request.CarRequest;
import com.vlad.kuzhyr.driverservice.web.dto.response.CarResponse;
import com.vlad.kuzhyr.driverservice.web.dto.response.PageResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
Expand All @@ -23,10 +23,9 @@
public class CarServiceImpl implements CarService {

private final CarRepository carRepository;

private final CarMapper carMapper;

private final PageResponseMapper pageResponseMapper;
private final CarValidator carValidator;

@Override
public CarResponse getCarById(Long id) {
Expand All @@ -51,24 +50,23 @@ public PageResponse<CarResponse> getAllCar(Integer currentPage, Integer limit) {
public CarResponse createCar(CarRequest carRequest) {
String carRequestNumber = carRequest.carNumber();

if (carRepository.existsCarByCarNumberAndIsEnabledTrue(carRequestNumber)) {
throw new CarAlreadyExistException(
ExceptionMessageConstant.CAR_ALREADY_EXISTS_BY_CAR_NUMBER_MESSAGE.formatted(carRequestNumber)
);
}
carValidator.validateCarByNumber(carRequestNumber);

Car newCar = carMapper.toEntity(carRequest);
Car savedCar = carRepository.save(newCar);

return carMapper.toResponse(savedCar);
}

@Override
@Transactional
public CarResponse updateCar(Long id, CarRequest carRequest) {
Car existCar = getExistingCarById(id);

carMapper.updateFromRequest(carRequest, existCar);
carRepository.save(existCar);
return carMapper.toResponse(existCar);
Car savedCar = carRepository.save(existCar);

return carMapper.toResponse(savedCar);
}

@Override
Expand All @@ -78,8 +76,8 @@ public Boolean deleteCarById(Long id) {

existCar.setDriver(null);
existCar.setIsEnabled(Boolean.FALSE);

carRepository.save(existCar);

return Boolean.TRUE;
}

Expand All @@ -91,4 +89,3 @@ private Car getExistingCarById(Long id) {
}

}

Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.vlad.kuzhyr.driverservice.service.impl;

import com.vlad.kuzhyr.driverservice.exception.CarAlreadyExistException;
import com.vlad.kuzhyr.driverservice.exception.CarNotFoundException;
import com.vlad.kuzhyr.driverservice.persistence.entity.Car;
import com.vlad.kuzhyr.driverservice.persistence.entity.Driver;
Expand All @@ -10,10 +9,11 @@
import com.vlad.kuzhyr.driverservice.utility.constant.ExceptionMessageConstant;
import com.vlad.kuzhyr.driverservice.utility.mapper.DriverMapper;
import com.vlad.kuzhyr.driverservice.utility.mapper.PageResponseMapper;
import com.vlad.kuzhyr.driverservice.web.request.DriverRequest;
import com.vlad.kuzhyr.driverservice.web.request.DriverUpdateCarsRequest;
import com.vlad.kuzhyr.driverservice.web.response.DriverResponse;
import com.vlad.kuzhyr.driverservice.web.response.PageResponse;
import com.vlad.kuzhyr.driverservice.utility.validator.DriverValidator;
import com.vlad.kuzhyr.driverservice.web.dto.request.DriverRequest;
import com.vlad.kuzhyr.driverservice.web.dto.request.DriverUpdateCarsRequest;
import com.vlad.kuzhyr.driverservice.web.dto.response.DriverResponse;
import com.vlad.kuzhyr.driverservice.web.dto.response.PageResponse;
import jakarta.transaction.Transactional;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand All @@ -27,19 +27,14 @@
public class DriverServiceImpl implements DriverService {

private final DriverRepository driverRepository;

private final DriverMapper driverMapper;

private final CarRepository carRepository;

private final PageResponseMapper pageResponseMapper;
private final DriverValidator driverValidator;

@Override
public DriverResponse getDriverById(Long id) {
Driver existDriver = driverRepository.findDriverByIdAndIsEnabledTrue(id)
.orElseThrow(() -> new CarNotFoundException(
ExceptionMessageConstant.DRIVER_NOT_FOUND_MESSAGE.formatted(id)
));
Driver existDriver = getDriverOrElseThrow(id);

return driverMapper.toResponse(existDriver);
}
Expand All @@ -62,71 +57,72 @@ public DriverResponse createDriver(DriverRequest driverRequest) {
String driverRequestEmail = driverRequest.email();
String driverRequestPhone = driverRequest.phone();

if (driverRepository.existsDriverByEmailAndIsEnabledTrue(driverRequestEmail)) {
throw new CarAlreadyExistException(
ExceptionMessageConstant.DRIVER_ALREADY_EXISTS_BY_EMAIL_MESSAGE.formatted(driverRequestEmail)
);
}
driverValidator.validateDriver(driverRequestEmail, driverRequestPhone);

if (driverRepository.existsDriverByPhoneAndIsEnabledTrue(driverRequestPhone)) {
throw new CarAlreadyExistException(
ExceptionMessageConstant.DRIVER_ALREADY_EXISTS_BY_PHONE_MESSAGE.formatted(driverRequestPhone)
);
}

List<Car> cars = carRepository.findAllById(driverRequest.carIds());
Driver newDriver = driverMapper.toEntity(driverRequest);
cars.forEach(car -> car.setDriver(newDriver));
newDriver.setCars(cars);
List<Car> cars = carRepository.findAllById(driverRequest.carIds());
setCarsDriver(newDriver, cars);
Driver savedDriver = driverRepository.save(newDriver);

return driverMapper.toResponse(savedDriver);
}

@Override
@Transactional
public DriverResponse updateDriver(Long id, DriverRequest driverRequest) {
Driver existDriver = driverRepository.findDriverByIdAndIsEnabledTrue(id)
.orElseThrow(() -> new CarNotFoundException(
ExceptionMessageConstant.DRIVER_NOT_FOUND_MESSAGE.formatted(id)
));
String driverRequestEmail = driverRequest.email();
String driverRequestPhone = driverRequest.phone();

driverValidator.validateDriver(driverRequestEmail, driverRequestPhone);

Driver existDriver = getDriverOrElseThrow(id);

List<Car> cars = carRepository.findAllById(driverRequest.carIds());
driverMapper.updateFromRequest(driverRequest, existDriver);
existDriver.setCars(cars);
cars.forEach(car -> car.setDriver(existDriver));
driverRepository.save(existDriver);
return driverMapper.toResponse(existDriver);
setCarsDriver(existDriver, cars);
Driver savedDriver = driverRepository.save(existDriver);

return driverMapper.toResponse(savedDriver);
}

@Override
@Transactional
public DriverResponse updateDriverCarsById(Long id, DriverUpdateCarsRequest driverUpdateCarsRequest) {
Driver existDriver = driverRepository.findDriverByIdAndIsEnabledTrue(id)
.orElseThrow(() -> new CarNotFoundException(
ExceptionMessageConstant.DRIVER_NOT_FOUND_MESSAGE.formatted(id)
));
Driver existDriver = getDriverOrElseThrow(id);

List<Car> cars = carRepository.findAllById(driverUpdateCarsRequest.carIds());
existDriver.setCars(cars);
cars.forEach(car -> car.setDriver(existDriver));
driverRepository.save(existDriver);
return driverMapper.toResponse(existDriver);
setCarsDriver(existDriver, cars);
Driver savedDriver = driverRepository.save(existDriver);

return driverMapper.toResponse(savedDriver);
}

@Override
@Transactional
public Boolean deleteDriverById(Long id) {
Driver existDriver = driverRepository.findDriverByIdAndIsEnabledTrue(id)
.orElseThrow(() -> new CarNotFoundException(
ExceptionMessageConstant.DRIVER_NOT_FOUND_MESSAGE.formatted(id))
);
Driver existDriver = getDriverOrElseThrow(id);

List<Car> cars = existDriver.getCars();
cars.forEach(car -> car.setDriver(null));
existDriver.setCars(null);
deleteCarsFromDriver(existDriver);
existDriver.setIsEnabled(Boolean.FALSE);
driverRepository.save(existDriver);

return Boolean.TRUE;
}

private void setCarsDriver(Driver existDriver, List<Car> cars) {
existDriver.setCars(cars);
cars.forEach(car -> car.setDriver(existDriver));
}

private void deleteCarsFromDriver(Driver existDriver) {
List<Car> cars = existDriver.getCars();
cars.forEach(car -> car.setDriver(null));
existDriver.setCars(null);
}

private Driver getDriverOrElseThrow(Long id) {
return driverRepository.findDriverByIdAndIsEnabledTrue(id).orElseThrow(
() -> new CarNotFoundException(ExceptionMessageConstant.DRIVER_NOT_FOUND_MESSAGE.formatted(id)));
}

}
Loading