diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..aa00ffa
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..5ddb3b3
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index d843f34..35eb1dd 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,4 +1,6 @@
-
+
+
+
\ No newline at end of file
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDTO.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDTO.java
new file mode 100644
index 0000000..6447380
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDTO.java
@@ -0,0 +1,15 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription;
+
+import lombok.Builder;
+import lombok.Getter;
+import java.util.UUID;
+
+@Builder
+@Getter
+public class SubscriptionDTO {
+ private final UUID id;
+ private final UUID customerId;
+ private final Integer duration;
+ private final String paymentMethod;
+ private final String debutDate;
+}
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionInfo.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionInfo.java
new file mode 100644
index 0000000..2bf5638
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionInfo.java
@@ -0,0 +1,7 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription;
+
+import java.util.UUID;
+
+public record SubscriptionInfo(UUID customerId, Integer duration, String paymentMethod) {
+
+}
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverter.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverter.java
new file mode 100644
index 0000000..9f8aaca
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverter.java
@@ -0,0 +1,31 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription.converter;
+
+
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDTO;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription;
+
+public final class SubscriptionConverter {
+ private SubscriptionConverter() {
+
+ }
+
+ public static Subscription toDomain(SubscriptionInfo newSubscription) {
+ return Subscription.builder()
+ .customerId(newSubscription.customerId())
+ .duration(newSubscription.duration())
+ .paymentMethod(newSubscription.paymentMethod())
+ .build();
+ }
+
+ public static SubscriptionDTO toDTO(Subscription subscription) {
+ return SubscriptionDTO.builder()
+ .id(subscription.getId())
+ .customerId(subscription.getCustomerId())
+ .duration(subscription.getDuration())
+ .paymentMethod(subscription.getPaymentMethod())
+ .debutDate(subscription.getDebutDate())
+ .build();
+ }
+
+}
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/Subscription.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/Subscription.java
new file mode 100644
index 0000000..7d0efe3
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/Subscription.java
@@ -0,0 +1,24 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity;
+
+import java.util.UUID;
+import lombok.Builder;
+import lombok.Getter;
+import java.time.LocalDate;
+
+@Builder
+@Getter
+public class Subscription {
+ private UUID id;
+ private UUID customerId;
+ private Integer duration;
+ private String paymentMethod;
+ private String debutDate;
+
+ public void setRandomUUID() {
+ this.id = UUID.randomUUID();
+ }
+
+ public void setDebutDate(String debutDate) {
+ this.debutDate = LocalDate.now().toString();
+ }
+}
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionException.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionException.java
new file mode 100644
index 0000000..4ab97d2
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionException.java
@@ -0,0 +1,8 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception;
+
+public class NotValidSubscriptionException extends Exception {
+
+ public NotValidSubscriptionException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundException.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundException.java
new file mode 100644
index 0000000..26f1e1b
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundException.java
@@ -0,0 +1,12 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception;
+
+import java.text.MessageFormat;
+import java.util.UUID;
+
+public class SubscriptionNotFoundException extends Exception {
+
+ public static final String THE_SUBSCRIPTION_WITH_ID_DOES_NOT_EXIST_MESSAGE = "The customer with id {0} does not exist";
+ public SubscriptionNotFoundException(UUID uuid) {
+ super(MessageFormat.format(THE_SUBSCRIPTION_WITH_ID_DOES_NOT_EXIST_MESSAGE, uuid));
+ }
+}
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepository.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepository.java
new file mode 100644
index 0000000..5d4e682
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepository.java
@@ -0,0 +1,36 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription.repository;
+
+import fr.iut_fbleau.but3.dev62.mylibrary.customer.entity.Customer;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import lombok.NoArgsConstructor;
+
+public class SubscriptionRepository {
+ private final List subscriptions = new ArrayList<>();
+
+ public List findAll() {
+ return subscriptions;
+ }
+
+ public Subscription save(Subscription newSubscription) {
+ Optional optionalSubscriptionWithSameId = this.findByCustomerId(newSubscription.getCustomerId());
+ optionalSubscriptionWithSameId.ifPresentOrElse(subscriptions::remove, newSubscription::setRandomUUID);
+ this.subscriptions.add(newSubscription);
+ return newSubscription;
+ }
+
+ public Optional findByCustomerId(UUID uuid) {
+ return this.subscriptions.stream()
+ .filter(subscription -> subscription.getCustomerId().equals(uuid))
+ .findFirst();
+ }
+
+ public boolean existsById(UUID uuid) {
+ return this.subscriptions.stream()
+ .anyMatch(subscription -> subscription.getId().equals(uuid));
+ }
+
+}
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCase.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCase.java
new file mode 100644
index 0000000..a8c5e24
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCase.java
@@ -0,0 +1,45 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription.usecase;
+
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDTO;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.converter.SubscriptionConverter;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.SubscriptionNotFoundException;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.repository.SubscriptionRepository;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.validator.SubscriptionValidator;
+import java.util.Optional;
+import java.util.UUID;
+
+public class SubscriptionUseCase {
+
+ private final SubscriptionRepository subscriptionRepository;
+
+ public SubscriptionUseCase(SubscriptionRepository subscriptionRepository) {
+ this.subscriptionRepository = subscriptionRepository;
+ }
+
+ public UUID registerSubscription(SubscriptionInfo newSubscription) throws NotValidSubscriptionException {
+ SubscriptionValidator.validate(newSubscription);
+ Subscription subscriptionToRegister = SubscriptionConverter.toDomain(newSubscription);
+ Subscription subscriptionToRegistered = subscriptionRepository.save(subscriptionToRegister);
+ if (subscriptionToRegistered.getDuration() <= 0) {
+ throw new NotValidSubscriptionException("Duration must be positive");
+ }
+ return subscriptionToRegistered.getId();
+ }
+
+ public Optional findSubscriptionByCustomerId(UUID customerId) {
+ Optional optionalSubscription = subscriptionRepository.findByCustomerId(customerId);
+ return optionalSubscription.map(SubscriptionConverter::toDTO);
+ }
+
+ private boolean getSubscriptionIfDoesNotExistThrowSubscriptionNotFoundException(UUID uuid)
+ throws SubscriptionNotFoundException {
+ if (subscriptionRepository.existsById(uuid)) {
+ throw new SubscriptionNotFoundException(uuid);
+ }
+ return subscriptionRepository.existsById(uuid);
+ }
+
+}
diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidator.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidator.java
new file mode 100644
index 0000000..51112ec
--- /dev/null
+++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidator.java
@@ -0,0 +1,38 @@
+package fr.iut_fbleau.but3.dev62.mylibrary.subscription.validator;
+
+import fr.iut_fbleau.but3.dev62.mylibrary.customer.CustomerInfo;
+import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.NotValidCustomerException;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDTO;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException;
+
+public class SubscriptionValidator {
+
+ public static final String CUSTOMER_ID_CANNOT_BE_NULL = "Customer ID cannot be null";
+ public static final String DURATION_CANNOT_BE_NULL = "Duration is not valid";
+ public static final String PAYMENT_METHOD_CANNOT_BE_BLANK = "Payment Method cannot be blank";
+
+
+ private SubscriptionValidator() {
+
+ }
+
+ public static void validate(SubscriptionInfo newSubscription) throws fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException {
+ validateDuration(newSubscription);
+ validatePaymentMethod(newSubscription);
+ }
+
+
+ private static void validateDuration(SubscriptionInfo newSubscription) throws fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException {
+ if (newSubscription.duration() == null) {
+ throw new fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException(DURATION_CANNOT_BE_NULL);
+ }
+ }
+
+ private static void validatePaymentMethod(SubscriptionInfo newSubscription) throws fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException {
+ if (newSubscription.paymentMethod().isBlank()) {
+ throw new NotValidSubscriptionException(PAYMENT_METHOD_CANNOT_BE_BLANK);
+ }
+ }
+
+}
diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/features/subscription/SubscriptionSteps.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/features/subscription/SubscriptionSteps.java
index 7fc7c0b..eb52963 100644
--- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/features/subscription/SubscriptionSteps.java
+++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/features/subscription/SubscriptionSteps.java
@@ -6,7 +6,13 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import fr.iut_fbleau.but3.dev62.mylibrary.customer.CustomerInfo;
+import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.NotValidCustomerException;
+import fr.iut_fbleau.but3.dev62.mylibrary.customer.usecase.CustomerUseCase;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.repository.SubscriptionRepository;
+import fr.iut_fbleau.but3.dev62.mylibrary.subscription.usecase.SubscriptionUseCase;
import fr.iut_fbleau.but3.dev62.mylibrary.customer.entity.Customer;
import fr.iut_fbleau.but3.dev62.mylibrary.customer.repository.CustomerRepository;
import io.cucumber.datatable.DataTable;
@@ -23,8 +29,12 @@ import java.util.UUID;
public class SubscriptionSteps {
- private final CustomerRepository customerRepository = new CustomerRepository();
+ private final SubscriptionRepository subscriptionRepository = new SubscriptionRepository();
+ private final SubscriptionUseCase subscriptionUseCase = new SubscriptionUseCase(subscriptionRepository);
+ private NotValidSubscriptionException notValidSubscriptionException;
+ private final CustomerRepository customerRepository = new CustomerRepository();
+ private UUID subscriptionRegistration;
private final Map customerPhoneUUID = new HashMap<>();
@Given("the system has the following customers:")
@@ -53,18 +63,20 @@ public class SubscriptionSteps {
}
@When("I create a new subscription with CB:")
- public void iCreateANewSubscriptionWithCB(DataTable dataTable) {
+ public void iCreateANewSubscriptionWithCB(DataTable dataTable) throws NotValidSubscriptionException {
List