Skip to content

Commit 96fc504

Browse files
author
Christopher Eteka
committed
Allow client's spring boot starter to allow for more advanced configs
1 parent 44ef078 commit 96fc504

13 files changed

Lines changed: 273 additions & 33 deletions

File tree

paystack-clients-spring-boot-starter/src/main/java/com/chrisworks/paystackclient/PaystackClientsProperties.java

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.chrisworks.paystackclient;
2+
3+
import com.chrisworks.paystackclient.definitions.Constants;
4+
5+
public enum SupportedClient {
6+
APPLE_PAY(Constants.APPLE_PAY_CLIENT),
7+
PLAN(Constants.PLAN_CLIENT),
8+
PRODUCT(Constants.PRODUCT_CLIENT),
9+
SUB_ACCOUNT(Constants.SUB_ACCOUNT_CLIENT),
10+
TRANSACTION(Constants.TRANSACTION_CLIENT);
11+
12+
private final String beanName;
13+
14+
public String beanName() {
15+
return beanName;
16+
}
17+
18+
SupportedClient(String beanName) {
19+
this.beanName = beanName;
20+
}
21+
}

paystack-clients-spring-boot-starter/src/main/java/com/chrisworks/paystackclient/autoconfigure/PaystackClientsAutoConfiguration.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.chrisworks.paystackclient.autoconfigure;
22

3-
import com.chrisworks.paystackclient.PaystackClientsProperties;
4-
import com.chrisworks.paystackclient.YamlPropertySourceFactory;
3+
import com.chrisworks.paystackclient.configs.PaystackClientsProperties;
4+
import com.chrisworks.paystackclient.configs.YamlPropertySourceFactory;
5+
import com.chrisworks.paystackclient.definitions.ReactivePaystackClient;
6+
import com.chrisworks.paystackclient.definitions.SimplePaystackClient;
57
import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
68
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
79
import org.springframework.boot.context.properties.EnableConfigurationProperties;
10+
import org.springframework.context.annotation.ComponentScan;
811
import org.springframework.context.annotation.Configuration;
912
import org.springframework.context.annotation.PropertySource;
1013

@@ -20,6 +23,7 @@ public class PaystackClientsAutoConfiguration {
2023
@Configuration
2124
@ConditionalOnProperty(prefix = "paystack-client", name = "definition-type", havingValue = "NON_REACTIVE", matchIfMissing = true)
2225
@AutoConfigurationPackage(basePackages = "com.chrisworks.paystackclient.definitions.simple")
26+
@ComponentScan(basePackageClasses = SimplePaystackClient.class)
2327
public static class NonReactiveClientConfiguration {}
2428

2529
/**
@@ -28,5 +32,6 @@ public static class NonReactiveClientConfiguration {}
2832
@Configuration
2933
@ConditionalOnProperty(prefix = "paystack-client", name = "definition-type", havingValue = "REACTIVE")
3034
@AutoConfigurationPackage(basePackages = "com.chrisworks.paystackclient.definitions.reactive")
35+
@ComponentScan(basePackageClasses = ReactivePaystackClient.class)
3136
public static class ReactiveClientConfiguration {}
3237
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.chrisworks.paystackclient.conditions;
2+
3+
import org.springframework.context.annotation.ConditionContext;
4+
import org.springframework.context.annotation.ConfigurationCondition;
5+
import org.springframework.core.env.ConfigurableEnvironment;
6+
import org.springframework.core.env.MapPropertySource;
7+
import org.springframework.core.type.AnnotatedTypeMetadata;
8+
import org.springframework.lang.NonNull;
9+
10+
import java.util.Arrays;
11+
12+
import static com.chrisworks.paystackclient.configs.PaystackClientsProperties.ACTIVATED_CLIENTS_PATH;
13+
14+
public class NoClientIsSelectedToBeActive implements ConfigurationCondition {
15+
16+
@Override
17+
public boolean matches(ConditionContext context, @NonNull AnnotatedTypeMetadata metadata) {
18+
19+
return ((ConfigurableEnvironment) context.getEnvironment()).getPropertySources()
20+
.stream()
21+
.<String[]>mapMulti((a, b) -> {
22+
if (a instanceof MapPropertySource mapPropertySource) {
23+
b.accept(mapPropertySource.getPropertyNames());
24+
}
25+
})
26+
.flatMap(Arrays::stream)
27+
.noneMatch(k -> k.startsWith(ACTIVATED_CLIENTS_PATH));
28+
}
29+
30+
@NonNull
31+
@Override
32+
public ConfigurationPhase getConfigurationPhase() {
33+
return ConfigurationPhase.REGISTER_BEAN;
34+
}
35+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.chrisworks.paystackclient.configs;
2+
3+
import com.chrisworks.paystackclient.SupportedClient;
4+
import com.chrisworks.paystackclient.definitions.DefinitionType;
5+
import org.springframework.boot.context.properties.ConfigurationProperties;
6+
7+
import java.util.Collections;
8+
import java.util.Set;
9+
10+
@ConfigurationProperties(PaystackClientsProperties.PREFIX)
11+
public class PaystackClientsProperties {
12+
13+
public static final String PREFIX = "paystack-client";
14+
public static final String ACTIVATED_CLIENTS_PATH = PREFIX + ".activate-only-clients";
15+
16+
17+
private String secretKey;
18+
private DefinitionType definitionType = DefinitionType.NON_REACTIVE;
19+
private Set<SupportedClient> activateOnlyClients = Collections.emptySet();
20+
21+
public String getSecretKey() {
22+
return secretKey;
23+
}
24+
25+
public void setSecretKey(String secretKey) {
26+
this.secretKey = secretKey;
27+
}
28+
29+
public DefinitionType getDefinitionType() {
30+
return definitionType;
31+
}
32+
33+
public void setDefinitionType(DefinitionType definitionType) {
34+
this.definitionType = definitionType;
35+
}
36+
37+
public Set<SupportedClient> getActivateOnlyClients() {
38+
return activateOnlyClients;
39+
}
40+
41+
public void setActivateOnlyClients(Set<SupportedClient> activateOnlyClients) {
42+
this.activateOnlyClients = activateOnlyClients;
43+
}
44+
}

paystack-clients-spring-boot-starter/src/main/java/com/chrisworks/paystackclient/YamlPropertySourceFactory.java renamed to paystack-clients-spring-boot-starter/src/main/java/com/chrisworks/paystackclient/configs/YamlPropertySourceFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.chrisworks.paystackclient;
1+
package com.chrisworks.paystackclient.configs;
22

33
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
44
import org.springframework.context.annotation.Configuration;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.chrisworks.paystackclient.definitions;
2+
3+
import com.chrisworks.paystackclient.conditions.NoClientIsSelectedToBeActive;
4+
import com.chrisworks.paystackclient.definitions.reactive.*;
5+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
6+
import org.springframework.context.annotation.Conditional;
7+
import org.springframework.stereotype.Component;
8+
9+
public interface ReactivePaystackClient {
10+
11+
ApplePayClient applePay();
12+
PlanClient plan();
13+
ProductClient product();
14+
SubAccountClient subAccount();
15+
TransactionClient transaction();
16+
17+
@Component(value = "reactivePaystackClient")
18+
@Conditional(NoClientIsSelectedToBeActive.class)
19+
@ConditionalOnProperty(prefix = "paystack-client", name = "definition-type", havingValue = "REACTIVE")
20+
record Impl(ApplePayClient applePay, PlanClient plan, ProductClient product,
21+
SubAccountClient subAccount, TransactionClient transaction) implements ReactivePaystackClient {}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.chrisworks.paystackclient.definitions;
2+
3+
import com.chrisworks.paystackclient.conditions.NoClientIsSelectedToBeActive;
4+
import com.chrisworks.paystackclient.definitions.simple.*;
5+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
6+
import org.springframework.context.annotation.Conditional;
7+
import org.springframework.stereotype.Component;
8+
9+
public interface SimplePaystackClient {
10+
11+
ApplePayClient applePay();
12+
PlanClient plan();
13+
ProductClient product();
14+
SubAccountClient subAccount();
15+
TransactionClient transaction();
16+
17+
@Component(value = "simplePaystackClient")
18+
@Conditional(NoClientIsSelectedToBeActive.class)
19+
@ConditionalOnProperty(prefix = "paystack-client", name = "definition-type", havingValue = "NON_REACTIVE", matchIfMissing = true)
20+
record Impl(ApplePayClient applePay, PlanClient plan, ProductClient product,
21+
SubAccountClient subAccount, TransactionClient transaction) implements SimplePaystackClient {}
22+
}

paystack-clients-spring-boot-starter/src/main/java/com/chrisworks/paystackclient/definitions/reactive/ProductClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Mono<ProductResponse.Multiple> listProducts(
2929
@RequestParam(name = QueryParamConstants.PER_PAGE) @NonNull BigInteger perPage,
3030
@RequestParam(name = QueryParamConstants.FROM, required = false)ZonedDateTime from,
3131
@RequestParam(name = QueryParamConstants.TO, required = false)ZonedDateTime to
32-
);
32+
);
3333

3434
@GetExchange("/{id}")
3535
Mono<ProductResponse.Single> fetchProduct(@PathVariable String id);

paystack-clients-spring-boot-starter/src/main/java/com/chrisworks/paystackclient/definitions/reactive/TransactionClient.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ public interface TransactionClient {
2020

2121
@PostExchange("/initialize")
2222
Mono<InitTransactionResponse.Single> initializeTransaction(@RequestBody InitTransactionRequest body);
23+
2324
@GetExchange("/verify/{reference}")
2425
Mono<TransactionResponse.Single> verifyTransaction(@PathVariable String reference);
26+
2527
@GetExchange
2628
Mono<TransactionResponse.Multiple> listTransaction(
2729
@RequestParam(name = QueryParamConstants.PAGE) @NonNull BigInteger page,
@@ -34,19 +36,24 @@ Mono<TransactionResponse.Multiple> listTransaction(
3436
@RequestParam(name = QueryParamConstants.AMOUNT, required = false) String amount
3537

3638
);
39+
3740
@GetExchange("/{id}")
3841
Mono<TransactionResponse.Single> fetchTransaction(@PathVariable BigInteger id);
42+
3943
@PostExchange("/charge_authorization")
4044
Mono<TransactionTotalResponse.Single> chargeAuthorization(@RequestBody ChargeAuthorizationRequest body);
45+
4146
@GetExchange("/timeline/{idOrReference}")
4247
Mono<TimeLineResponse.Single> viewTransactionTimeLine(@PathVariable String idOrReference);
48+
4349
@GetExchange("/totals")
4450
Mono<TransactionTotalResponse.Single> transactionTotals(
4551
@RequestParam(name = QueryParamConstants.PAGE) @NonNull BigInteger page,
4652
@RequestParam(name = QueryParamConstants.PER_PAGE) @NonNull BigInteger perPage,
4753
@RequestParam(name = QueryParamConstants.FROM, required = false) ZonedDateTime from,
4854
@RequestParam(name = QueryParamConstants.TO, required = false) ZonedDateTime to
4955
);
56+
5057
@GetExchange("/export")
5158
Mono<ExportTransactionResponse.Single> exportTransactions(
5259
@RequestParam(name = QueryParamConstants.PAGE) @NonNull BigInteger page,
@@ -62,6 +69,7 @@ Mono<ExportTransactionResponse.Single> exportTransactions(
6269
@RequestParam(name = QueryParamConstants.PAYMENT_PAGE, required = false) BigInteger paymentPage
6370

6471
);
72+
6573
@PostExchange("/partial_debit")
6674
Mono<TransactionTotalResponse.Single> partialDebit(@RequestBody PartialDebitRequest body);
6775
}

0 commit comments

Comments
 (0)