diff --git a/pom.xml b/pom.xml index 46596bf..81ba5ec 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ 2.1.0 - org.liquibase + org.liquibase liquibase-core ${liquibase.version} @@ -49,9 +49,9 @@ ${liquibase.version} - mysql - mysql-connector-java - 8.0.33 + com.mysql + mysql-connector-j + 8.1.0 org.projectlombok @@ -79,9 +79,9 @@ ${mapstruct.version} - jakarta.validation - jakarta.validation-api - 2.0.2 + com.stripe + stripe-java + 23.7.0 org.telegram @@ -164,5 +164,4 @@ - diff --git a/src/main/java/com/project/carsharingapp/controller/PaymentController.java b/src/main/java/com/project/carsharingapp/controller/PaymentController.java new file mode 100644 index 0000000..6bc634f --- /dev/null +++ b/src/main/java/com/project/carsharingapp/controller/PaymentController.java @@ -0,0 +1,52 @@ +package com.project.carsharingapp.controller; + +import com.project.carsharingapp.dto.payment.CreatePaymentSessionRequestDto; +import com.project.carsharingapp.model.Payment; +import com.project.carsharingapp.service.PaymentService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "Payment management", description = "Endpoint for managing payments") +@RestController +@RequestMapping("/payments") +@RequiredArgsConstructor +public class PaymentController { + private final PaymentService paymentService; + + @GetMapping + @Operation(summary = "Get all user's payments") + public List getAll(Pageable pageable) { + return paymentService.getAll(pageable); + } + + @PostMapping + @Operation(summary = "Create a new payment session") + public Payment create( + @RequestBody @Valid CreatePaymentSessionRequestDto requestDto + ) { + return paymentService.create(requestDto); + } + + @GetMapping("/success") + @Operation(summary = "Redirect endpoint in case of successful payment") + private String redirectToSuccessPage(@RequestParam String sessionId) { + paymentService.updateStatus(sessionId); + return "success"; + } + + @GetMapping("/cancel") + @Operation(summary = "Redirect endpoint in case of paused payment") + private String redirectToFailedPage() { + return "cancel"; + } +} diff --git a/src/main/java/com/project/carsharingapp/controller/RentalController.java b/src/main/java/com/project/carsharingapp/controller/RentalController.java index 2d91247..9147995 100644 --- a/src/main/java/com/project/carsharingapp/controller/RentalController.java +++ b/src/main/java/com/project/carsharingapp/controller/RentalController.java @@ -2,7 +2,6 @@ import com.project.carsharingapp.dto.rental.CreateRentalRequestDto; import com.project.carsharingapp.dto.rental.RentalDto; -import com.project.carsharingapp.dto.rental.SetActualReturnDateRequestDto; import com.project.carsharingapp.service.rental.RentalService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -57,7 +56,7 @@ public RentalDto getById(@PathVariable Long id) { @ResponseStatus(HttpStatus.OK) @Operation(summary = "Set actual return date", description = "Set actual return date and increase car inventory by 1") - public RentalDto setActualReturnDay(Long id) { // Authnetication + public RentalDto setActualReturnDay(Long id) { return rentalService.setActualReturnDay(id); } } diff --git a/src/main/java/com/project/carsharingapp/dto/payment/CreatePaymentSessionRequestDto.java b/src/main/java/com/project/carsharingapp/dto/payment/CreatePaymentSessionRequestDto.java new file mode 100644 index 0000000..47450f2 --- /dev/null +++ b/src/main/java/com/project/carsharingapp/dto/payment/CreatePaymentSessionRequestDto.java @@ -0,0 +1,14 @@ +package com.project.carsharingapp.dto.payment; + +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CreatePaymentSessionRequestDto { + @NotNull + private Long rentalId; + @NotNull + private String type; +} diff --git a/src/main/java/com/project/carsharingapp/dto/payment/PaymentResponseDto.java b/src/main/java/com/project/carsharingapp/dto/payment/PaymentResponseDto.java new file mode 100644 index 0000000..7fba6ec --- /dev/null +++ b/src/main/java/com/project/carsharingapp/dto/payment/PaymentResponseDto.java @@ -0,0 +1,4 @@ +package com.project.carsharingapp.dto.payment; + +public class PaymentResponseDto { +} diff --git a/src/main/java/com/project/carsharingapp/dto/rental/RentalSearchParametersDto.java b/src/main/java/com/project/carsharingapp/dto/rental/RentalSearchParametersDto.java index 3d8ffd1..3480660 100644 --- a/src/main/java/com/project/carsharingapp/dto/rental/RentalSearchParametersDto.java +++ b/src/main/java/com/project/carsharingapp/dto/rental/RentalSearchParametersDto.java @@ -1,5 +1,7 @@ package com.project.carsharingapp.dto.rental; -public record RentalSearchParametersDto(String[] userId, - String[] isActive) { -} \ No newline at end of file +public record RentalSearchParametersDto( + String[] userId, + String[] isActive +) { +} diff --git a/src/main/java/com/project/carsharingapp/model/Payment.java b/src/main/java/com/project/carsharingapp/model/Payment.java index 35c03c0..d16e290 100644 --- a/src/main/java/com/project/carsharingapp/model/Payment.java +++ b/src/main/java/com/project/carsharingapp/model/Payment.java @@ -31,7 +31,7 @@ public class Payment { private Type type; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "rental_id", nullable = false) - private Rental rentalId; + private Rental rental; @Column(name = "session_url", nullable = false) private String sessionUrl; @Column(name = "session_id", nullable = false) diff --git a/src/main/java/com/project/carsharingapp/repository/PaymentRepository.java b/src/main/java/com/project/carsharingapp/repository/PaymentRepository.java index 6755b06..00b0fec 100644 --- a/src/main/java/com/project/carsharingapp/repository/PaymentRepository.java +++ b/src/main/java/com/project/carsharingapp/repository/PaymentRepository.java @@ -1,8 +1,13 @@ package com.project.carsharingapp.repository; import com.project.carsharingapp.model.Payment; +import java.util.Optional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; public interface PaymentRepository extends JpaRepository { + Optional findBySessionId(String sessionId); + Page findAll(Pageable pageable); } diff --git a/src/main/java/com/project/carsharingapp/repository/rentals/RentalRepository.java b/src/main/java/com/project/carsharingapp/repository/rentals/RentalRepository.java index d3923fd..f43194f 100644 --- a/src/main/java/com/project/carsharingapp/repository/rentals/RentalRepository.java +++ b/src/main/java/com/project/carsharingapp/repository/rentals/RentalRepository.java @@ -9,11 +9,10 @@ @Repository public interface RentalRepository extends JpaRepository { + @Query("FROM Rental r LEFT JOIN FETCH r.car " + + "LEFT JOIN FETCH r.user WHERE r.id = :id") + Optional findById(Long id); + @Query("FROM Rental r WHERE r.user.id = :userId AND r.isActive = :isActive") List findRentalsByUserIdAndActiveStatus(Long userId, boolean isActive); - -// @Query("FROM Rental r WHERE r.user.id = :userId AND r.isActive = :isActive") -// OptionalfindRentalByUserIdAndActiveStatus(Long userId, boolean isActive); - - } diff --git a/src/main/java/com/project/carsharingapp/repository/rentals/spec/UserSpecificationProvider.java b/src/main/java/com/project/carsharingapp/repository/rentals/spec/UserSpecificationProvider.java index df05312..ad7f03e 100644 --- a/src/main/java/com/project/carsharingapp/repository/rentals/spec/UserSpecificationProvider.java +++ b/src/main/java/com/project/carsharingapp/repository/rentals/spec/UserSpecificationProvider.java @@ -1,6 +1,5 @@ package com.project.carsharingapp.repository.rentals.spec; - import static com.project.carsharingapp.repository.rentals.RentalSpecificationBuilder.USER_ID_KEY; import com.project.carsharingapp.model.Rental; diff --git a/src/main/java/com/project/carsharingapp/service/PaymentAmountHandler.java b/src/main/java/com/project/carsharingapp/service/PaymentAmountHandler.java new file mode 100644 index 0000000..c2726c2 --- /dev/null +++ b/src/main/java/com/project/carsharingapp/service/PaymentAmountHandler.java @@ -0,0 +1,10 @@ +package com.project.carsharingapp.service; + +import com.project.carsharingapp.model.Payment; +import java.math.BigDecimal; + +public interface PaymentAmountHandler { + Long getPaymentAmount(BigDecimal dailyFee, int numberOfDays); + + boolean isApplicable(Payment.Type type); +} diff --git a/src/main/java/com/project/carsharingapp/service/PaymentService.java b/src/main/java/com/project/carsharingapp/service/PaymentService.java new file mode 100644 index 0000000..2607316 --- /dev/null +++ b/src/main/java/com/project/carsharingapp/service/PaymentService.java @@ -0,0 +1,14 @@ +package com.project.carsharingapp.service; + +import com.project.carsharingapp.dto.payment.CreatePaymentSessionRequestDto; +import com.project.carsharingapp.model.Payment; +import java.util.List; +import org.springframework.data.domain.Pageable; + +public interface PaymentService { + Payment create(CreatePaymentSessionRequestDto requestDto); + + Payment updateStatus(String sessionId); + + List getAll(Pageable pageable); +} diff --git a/src/main/java/com/project/carsharingapp/service/impl/FineAmountHandler.java b/src/main/java/com/project/carsharingapp/service/impl/FineAmountHandler.java new file mode 100644 index 0000000..0acaaf9 --- /dev/null +++ b/src/main/java/com/project/carsharingapp/service/impl/FineAmountHandler.java @@ -0,0 +1,21 @@ +package com.project.carsharingapp.service.impl; + +import com.project.carsharingapp.model.Payment; +import com.project.carsharingapp.service.PaymentAmountHandler; +import java.math.BigDecimal; +import org.springframework.stereotype.Component; + +@Component +public class FineAmountHandler implements PaymentAmountHandler { + private static final BigDecimal FINE_MULTIPLIER = BigDecimal.valueOf(1.25); + + @Override + public Long getPaymentAmount(BigDecimal dailyFee, int numberOfDays) { + return dailyFee.multiply(FINE_MULTIPLIER).longValue() * numberOfDays; + } + + @Override + public boolean isApplicable(Payment.Type type) { + return type.equals(Payment.Type.FINE); + } +} diff --git a/src/main/java/com/project/carsharingapp/service/impl/PaymentAmountHandlerStrategy.java b/src/main/java/com/project/carsharingapp/service/impl/PaymentAmountHandlerStrategy.java new file mode 100644 index 0000000..24551ab --- /dev/null +++ b/src/main/java/com/project/carsharingapp/service/impl/PaymentAmountHandlerStrategy.java @@ -0,0 +1,24 @@ +package com.project.carsharingapp.service.impl; + +import com.project.carsharingapp.model.Payment; +import com.project.carsharingapp.service.PaymentAmountHandler; +import java.util.List; +import java.util.NoSuchElementException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class PaymentAmountHandlerStrategy { + @Autowired + private List paymentAmountHandlers; + + public PaymentAmountHandler getHandler(Payment.Type type) { + return paymentAmountHandlers.stream() + .filter(paymentAmountHandler -> paymentAmountHandler.isApplicable(type)) + .findAny() + .orElseThrow(() -> + new NoSuchElementException("Can't find a PaymentAmountHandler " + + "for such type as: " + type) + ); + } +} diff --git a/src/main/java/com/project/carsharingapp/service/impl/PaymentServiceImpl.java b/src/main/java/com/project/carsharingapp/service/impl/PaymentServiceImpl.java new file mode 100644 index 0000000..250e2ca --- /dev/null +++ b/src/main/java/com/project/carsharingapp/service/impl/PaymentServiceImpl.java @@ -0,0 +1,66 @@ +package com.project.carsharingapp.service.impl; + +import com.project.carsharingapp.dto.payment.CreatePaymentSessionRequestDto; +import com.project.carsharingapp.exception.EntityNotFoundException; +import com.project.carsharingapp.model.Payment; +import com.project.carsharingapp.model.Rental; +import com.project.carsharingapp.repository.PaymentRepository; +import com.project.carsharingapp.repository.rentals.RentalRepository; +import com.project.carsharingapp.service.PaymentService; +import com.stripe.exception.StripeException; +import com.stripe.model.checkout.Session; +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PaymentServiceImpl implements PaymentService { + private final RentalRepository rentalRepository; + private final PaymentRepository paymentRepository; + private final StripeService stripeService; + + @Override + public Payment create(CreatePaymentSessionRequestDto requestDto) { + Rental rental = rentalRepository.findById(requestDto.getRentalId()).orElseThrow( + () -> new EntityNotFoundException("Can't find a Rental by id: " + + requestDto.getRentalId()) + ); + Payment.Type type = Payment.Type.valueOf(requestDto.getType()); + try { + Session session = stripeService.createSession(rental, type); + Payment payment = generatePayment(session, rental, type); + return paymentRepository.save(payment); + } catch (StripeException e) { + throw new RuntimeException("Can't create a stripe checkout session!"); + } + } + + @Override + public Payment updateStatus(String sessionId) { + Payment payment = paymentRepository.findBySessionId(sessionId).orElseThrow( + () -> new EntityNotFoundException("Can't find a Payment by the session") + ); + payment.setStatus(Payment.Status.PAID); + return paymentRepository.save(payment); + } + + @Override + public List getAll(Pageable pageable) { + return paymentRepository.findAll(pageable).stream().collect(Collectors.toList()); + } + + private Payment generatePayment(Session session, Rental rental, Payment.Type type) { + Payment payment = new Payment(); + payment.setStatus(Payment.Status.PENDING); + payment.setType(type); + payment.setRental(rental); + payment.setSessionUrl(session.getUrl()); + payment.setSessionId(session.getId()); + payment.setAmount(BigDecimal.valueOf(session.getAmountTotal())); + return payment; + } +} diff --git a/src/main/java/com/project/carsharingapp/service/impl/RegularPaymentAmountHandler.java b/src/main/java/com/project/carsharingapp/service/impl/RegularPaymentAmountHandler.java new file mode 100644 index 0000000..a8fbf31 --- /dev/null +++ b/src/main/java/com/project/carsharingapp/service/impl/RegularPaymentAmountHandler.java @@ -0,0 +1,19 @@ +package com.project.carsharingapp.service.impl; + +import com.project.carsharingapp.model.Payment; +import com.project.carsharingapp.service.PaymentAmountHandler; +import java.math.BigDecimal; +import org.springframework.stereotype.Component; + +@Component +public class RegularPaymentAmountHandler implements PaymentAmountHandler { + @Override + public Long getPaymentAmount(BigDecimal dailyFee, int numberOfDays) { + return dailyFee.longValue() * numberOfDays; + } + + @Override + public boolean isApplicable(Payment.Type type) { + return type.equals(Payment.Type.PAYMENT); + } +} diff --git a/src/main/java/com/project/carsharingapp/service/impl/StripeService.java b/src/main/java/com/project/carsharingapp/service/impl/StripeService.java new file mode 100644 index 0000000..8b33ad8 --- /dev/null +++ b/src/main/java/com/project/carsharingapp/service/impl/StripeService.java @@ -0,0 +1,93 @@ +package com.project.carsharingapp.service.impl; + +import com.project.carsharingapp.model.Payment; +import com.project.carsharingapp.model.Rental; +import com.project.carsharingapp.service.PaymentAmountHandler; +import com.stripe.Stripe; +import com.stripe.exception.StripeException; +import com.stripe.model.checkout.Session; +import com.stripe.param.checkout.SessionCreateParams; +import jakarta.annotation.PostConstruct; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.Period; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.util.UriComponentsBuilder; + +@Service +@RequiredArgsConstructor +public class StripeService { + private static final String DEFAULT_URL_PART = "/api/payments"; + private static final String SUCCESS_ENDPOINT = "success"; + private static final String CANCEL_ENDPOINT = "cancel"; + private static final Long STANDARD_QUANTITY_OF_RENTAL_CART = 1L; + private static final String DEFAULT_CURRENCY = "USD"; + + private final PaymentAmountHandlerStrategy handler; + @Value("${stripe.secret}") + private String secretKey; + @Value("${app.host}") + private String host; + @Value("${app.port}") + private Integer port; + + @PostConstruct + public void init() { + Stripe.apiKey = secretKey; + } + + public Session createSession(Rental rental, Payment.Type type) throws StripeException { + String productName = rental.getCar().getModel(); + Long price = calculateTotalAmount(rental, type); + SessionCreateParams params = SessionCreateParams.builder() + .setMode(SessionCreateParams.Mode.PAYMENT) + .setSuccessUrl(createUrl(SUCCESS_ENDPOINT)) + .setCancelUrl(createUrl(CANCEL_ENDPOINT)) + .addLineItem( + SessionCreateParams.LineItem.builder() + .setPriceData( + SessionCreateParams.LineItem.PriceData.builder() + .setCurrency(DEFAULT_CURRENCY) + .setProductData( + SessionCreateParams.LineItem.PriceData + .ProductData.builder() + .setName(productName) + .build() + ) + .setUnitAmount(price) + .build() + ) + .setQuantity(STANDARD_QUANTITY_OF_RENTAL_CART) + .build() + ) + .build(); + + return Session.create(params); + } + + private String createUrl(String type) { + return UriComponentsBuilder.newInstance() + .scheme("http") + .host(host) + .port(port) + .path(DEFAULT_URL_PART + "/" + type) + .query("sessionId={CHECKOUT_SESSION_ID}") + .build() + .toUriString(); + } + + private Long calculateTotalAmount(Rental rental, Payment.Type type) { + PaymentAmountHandler amountHandler = handler.getHandler(type); + int rentalDays = getNumberOfRentalDays(rental); + BigDecimal dailyFee = rental.getCar().getDailyFee(); + return amountHandler.getPaymentAmount(dailyFee, rentalDays); + } + + private int getNumberOfRentalDays(Rental rental) { + LocalDate actualReturnDate = rental.getActualReturnDate().toLocalDate(); + LocalDate rentalDate = rental.getRentalDate().toLocalDate(); + return Period.between(rentalDate, actualReturnDate).getDays(); + } +} diff --git a/src/main/java/com/project/carsharingapp/service/rental/RentalService.java b/src/main/java/com/project/carsharingapp/service/rental/RentalService.java index 6bce197..6ec1358 100644 --- a/src/main/java/com/project/carsharingapp/service/rental/RentalService.java +++ b/src/main/java/com/project/carsharingapp/service/rental/RentalService.java @@ -2,7 +2,6 @@ import com.project.carsharingapp.dto.rental.CreateRentalRequestDto; import com.project.carsharingapp.dto.rental.RentalDto; -import com.project.carsharingapp.dto.rental.SetActualReturnDateRequestDto; import java.util.List; public interface RentalService { diff --git a/src/main/java/com/project/carsharingapp/service/rental/RentalServiceImpl.java b/src/main/java/com/project/carsharingapp/service/rental/RentalServiceImpl.java index 3a77bf1..fbbb79a 100644 --- a/src/main/java/com/project/carsharingapp/service/rental/RentalServiceImpl.java +++ b/src/main/java/com/project/carsharingapp/service/rental/RentalServiceImpl.java @@ -8,8 +8,8 @@ import com.project.carsharingapp.model.Rental; import com.project.carsharingapp.model.User; import com.project.carsharingapp.repository.CarRepository; -import com.project.carsharingapp.repository.rentals.RentalRepository; import com.project.carsharingapp.repository.UserRepository; +import com.project.carsharingapp.repository.rentals.RentalRepository; import java.time.LocalDateTime; import java.util.List; import lombok.RequiredArgsConstructor; @@ -27,16 +27,17 @@ public class RentalServiceImpl implements RentalService { public RentalDto add(CreateRentalRequestDto requestDto) { Rental rental = rentalMapper.toEntity(requestDto); rental.setCar(getCar(requestDto.getCarId())); - rental.setUser(getUser(requestDto.getCarId())); // Use auth obj here + rental.setUser(getUser(requestDto.getCarId())); rental.setActive(true); rental = rentalRepository.save(rental); - decreaseCarInventory(requestDto.getCarId()); // add notification + decreaseCarInventory(requestDto.getCarId()); return rentalMapper.toDto(rental); } @Override public List getByUserIdAndActiveStatus(Long userId, boolean isActive) { - List rentals = rentalRepository.findRentalsByUserIdAndActiveStatus(userId, isActive); + List rentals = rentalRepository + .findRentalsByUserIdAndActiveStatus(userId, isActive); if (rentals == null || rentals.isEmpty()) { throw new EntityNotFoundException("No rentals found for user id: " + userId + " and active status: " + isActive); @@ -46,19 +47,6 @@ public List getByUserIdAndActiveStatus(Long userId, boolean isActive) .toList(); } -// For User - -// private RentalDto getByUserIdAndActiveStatus(Auth userId, boolean isActive) { // -// Rental rentals = rentalRepository.findRentalByUserIdAndActiveStatus(userId, isActive); -// if (rentals == null || rentals.isEmpty()) { -// throw new EntityNotFoundException("No rentals found for user id: " -// + userId + " and active status: " + isActive); -// } -// return rentals.stream() -// .map(rentalMapper::toDto) -// .toList(); -// } - @Override public RentalDto getById(Long id) { Rental rental = rentalRepository.findById(id).orElseThrow( diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d76712d..06beab8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ spring.datasource.url=jdbc:mysql://localhost:3306/car_sharing_db?serverTimezone=UTC spring.datasource.username=root -spring.datasource.password=admin +spring.datasource.password=root123 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver server.servlet.context-path=/api @@ -8,5 +8,7 @@ spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=true spring.jpa.open-in-view=false -bot.name=SharingCarBot -bot.token=6631383610:AAExM59fyeZyshmxsmupqUrAV9TcitH30vk +stripe.secret=sk_test_51NwluPLODs6ppc0Lt4vFUOmyqkOeMpnbizJwy\ + BNFWQ0Y2rL79OtqPtydVF11PD2WoXiIkxCc3IrThcvWZkOmmn1e00ST12M2PI +app.host=localhost +app.port=8080 diff --git a/src/main/resources/db/changelog/changes/add-default-cars-to-cars-table.yaml b/src/main/resources/db/changelog/changes/add-default-cars-to-cars-table.yaml deleted file mode 100644 index d1927d2..0000000 --- a/src/main/resources/db/changelog/changes/add-default-cars-to-cars-table.yaml +++ /dev/null @@ -1,115 +0,0 @@ -databaseChangeLog: - - changeSet: - id: insert-car-1 - author: Dmytro Varukha - changes: - - insert: - tableName: cars - columns: - - column: - name: model - value: "Toyota Corolla" - - column: - name: brand - value: "Toyota" - - column: - name: inventory - value: 10 - - column: - name: car_type - value: "SEDAN" - - column: - name: daily_fee - value: 50.00 - - - changeSet: - id: insert-car-2 - author: Dmytro Varukha - changes: - - insert: - tableName: cars - columns: - - column: - name: model - value: "Honda Civic" - - column: - name: brand - value: "Honda" - - column: - name: inventory - value: 8 - - column: - name: car_type - value: "SEDAN" - - column: - name: daily_fee - value: 45.00 - - - changeSet: - id: insert-car-3 - author: Dmytro Varukha - changes: - - insert: - tableName: cars - columns: - - column: - name: model - value: "Ford Mustang" - - column: - name: brand - value: "Ford" - - column: - name: inventory - value: 5 - - column: - name: car_type - value: "UNIVERSAL" - - column: - name: daily_fee - value: 80.00 - - - changeSet: - id: insert-car-4 - author: Dmytro Varukha - changes: - - insert: - tableName: cars - columns: - - column: - name: model - value: "Volkswagen Golf" - - column: - name: brand - value: "Volkswagen" - - column: - name: inventory - value: 7 - - column: - name: car_type - value: "HATCHBACK" - - column: - name: daily_fee - value: 55.00 - - - changeSet: - id: insert-car-5 - author: Dmytro Varukha - changes: - - insert: - tableName: cars - columns: - - column: - name: model - value: "Chevrolet Tahoe" - - column: - name: brand - value: "Chevrolet" - - column: - name: inventory - value: 4 - - column: - name: car_type - value: "SUV" - - column: - name: daily_fee - value: 70.00 diff --git a/src/main/resources/db/changelog/changes/add-default-rentals-to-rentals-table.yaml b/src/main/resources/db/changelog/changes/add-default-rentals-to-rentals-table.yaml deleted file mode 100644 index 492eec0..0000000 --- a/src/main/resources/db/changelog/changes/add-default-rentals-to-rentals-table.yaml +++ /dev/null @@ -1,60 +0,0 @@ -databaseChangeLog: - - changeSet: - id: insert-rental-1 - author: Dmytro Varukha - changes: - - insert: - tableName: rentals - columns: - - column: - name: rental_date - value: "2023-10-15 09:00:00" - - column: - name: return_date - value: "2023-10-18 15:00:00" - - column: - name: car_id - value: 1 - - column: - name: user_id - value: 1 - - - changeSet: - id: insert-rental-2 - author: Dmytro Varukha - changes: - - insert: - tableName: rentals - columns: - - column: - name: rental_date - value: "2023-10-20 11:30:00" - - column: - name: return_date - value: "2023-10-25 10:15:00" - - column: - name: car_id - value: 2 - - column: - name: user_id - value: 2 - - - changeSet: - id: insert-rental-3 - author: Dmytro Varukha - changes: - - insert: - tableName: rentals - columns: - - column: - name: rental_date - value: "2023-10-12 14:45:00" - - column: - name: return_date - value: "2023-10-16 16:30:00" - - column: - name: car_id - value: 3 - - column: - name: user_id - value: 3 diff --git a/src/main/resources/db/changelog/changes/add-default-users-to-users-table.yaml b/src/main/resources/db/changelog/changes/add-default-users-to-users-table.yaml deleted file mode 100644 index 75ceb75..0000000 --- a/src/main/resources/db/changelog/changes/add-default-users-to-users-table.yaml +++ /dev/null @@ -1,69 +0,0 @@ -databaseChangeLog: - - changeSet: - id: insert-user-1 - author: Dmytro Varukha - changes: - - insert: - tableName: users - columns: - - column: - name: email - value: user1@example.com - - column: - name: first_name - value: John - - column: - name: last_name - value: Doe - - column: - name: password - value: password1 - - column: - name: telegram_chat_id - value: 1234567 - - - changeSet: - id: insert-user-2 - author: Dmytro Varukha - changes: - - insert: - tableName: users - columns: - - column: - name: email - value: user2@example.com - - column: - name: first_name - value: Jane - - column: - name: last_name - value: Smith - - column: - name: password - value: password2 - - column: - name: telegram_chat_id - value: 9876543 - - - changeSet: - id: insert-user-3 - author: Dmytro Varukha - changes: - - insert: - tableName: users - columns: - - column: - name: email - value: user3@example.com - - column: - name: first_name - value: Alice - - column: - name: last_name - value: Johnson - - column: - name: password - value: password3 - - column: - name: telegram_chat_id - value: 5555555 diff --git a/src/main/resources/db/changelog/changes/create-payments-table.yaml b/src/main/resources/db/changelog/changes/create-payments-table.yaml index ecce451..84e3239 100644 --- a/src/main/resources/db/changelog/changes/create-payments-table.yaml +++ b/src/main/resources/db/changelog/changes/create-payments-table.yaml @@ -32,12 +32,12 @@ databaseChangeLog: references: rentals(id) - column: name: session_url - type: varchar(255) + type: varchar(510) constraints: nullable: false - column: name: session_id - type: varchar(255) + type: varchar(510) constraints: nullable: false - column: diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 16b3e5e..ef49be4 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -11,11 +11,5 @@ databaseChangeLog: file: db/changelog/changes/create-rentals-table.yaml - include: file: db/changelog/changes/create-payments-table.yaml - - include: - file: db/changelog/changes/add-default-cars-to-cars-table.yaml - - include: - file: db/changelog/changes/add-default-users-to-users-table.yaml - - include: - file: db/changelog/changes/add-default-rentals-to-rentals-table.yaml - include: file: db/changelog/changes/add-is-active-column-to-rental-table.yaml diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index bc97def..440751f 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -4,5 +4,10 @@ spring.datasource.username=sa spring.datasource.password=password spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +stripe.secret=sk_test_51NwluPLODs6ppc0Lt4vFUOmyqkOeMpnbizJwy\ + BNFWQ0Y2rL79OtqPtydVF11PD2WoXiIkxCc3IrThcvWZkOmmn1e00ST12M2PI +app.host=localhost +app.port=8080 + bot.name=SharingCarBot bot.token=6631383610:AAExM59fyeZyshmxsmupqUrAV9TcitH30vk