Skip to content

Commit ed3431c

Browse files
authored
✨ Create classes and update code for the subaccount module (#49)
* 💻 Create SubaccountResponse (Single and Multiple) * 💻 Create request and response classes * 💻 Create client class and update other necessary classes * 🔧 fix my bug
1 parent a4bc119 commit ed3431c

11 files changed

Lines changed: 381 additions & 6 deletions

File tree

paystack-clients-spring-boot-starter/src/main/java/com/chrisworks/paystackclients/definitions/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ private Constants() {}
88
static final String APPLE_PAY_CLIENT = "apple-pay-client";
99
static final String TRANSACTION_CLIENT = "transaction-client";
1010
static final String PRODUCT_CLIENT = "product-client";
11+
static final String SUBACCOUNT_CLIENT = "subaccount-client";
1112
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,5 @@ ProductResponse.Multiple listProducts(
3333
ProductResponse.Single fetchProduct(@PathVariable String id);
3434

3535
@PutExchange("/{id}")
36-
ProductResponse.Multiple updateProduct(@PathVariable String id);
36+
ProductResponse.Single updateProduct(@PathVariable String id, @RequestBody CreateOrUpdateProductRequest body);
3737
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.chrisworks.paystackclients.definitions;
2+
3+
import com.chrisworks.paystackclient.domain.request.QueryParamConstants;
4+
import com.chrisworks.paystackclient.domain.subaccount.CreateSubaccountRequest;
5+
import com.chrisworks.paystackclient.domain.subaccount.SubaccountResponse;
6+
import com.chrisworks.paystackclient.domain.subaccount.UpdateSubaccountRequest;
7+
import com.maciejwalkowiak.spring.http.annotation.HttpClient;
8+
import org.springframework.lang.NonNull;
9+
import org.springframework.web.bind.annotation.PathVariable;
10+
import org.springframework.web.bind.annotation.RequestBody;
11+
import org.springframework.web.bind.annotation.RequestParam;
12+
import org.springframework.web.service.annotation.GetExchange;
13+
import org.springframework.web.service.annotation.PostExchange;
14+
import org.springframework.web.service.annotation.PutExchange;
15+
16+
import java.math.BigInteger;
17+
import java.time.ZonedDateTime;
18+
19+
@HttpClient(Constants.SUBACCOUNT_CLIENT)
20+
public interface SubaccountClient {
21+
22+
@PostExchange
23+
SubaccountResponse.Single createSubaccount(@RequestBody CreateSubaccountRequest body);
24+
25+
@GetExchange
26+
SubaccountResponse.Multiple listSubaccounts(
27+
@RequestParam(name = QueryParamConstants.PAGE) @NonNull BigInteger page,
28+
@RequestParam(name = QueryParamConstants.PER_PAGE) @NonNull BigInteger perPage,
29+
@RequestParam(name = QueryParamConstants.FROM, required = false) ZonedDateTime from,
30+
@RequestParam(name = QueryParamConstants.TO, required = false) ZonedDateTime to
31+
);
32+
33+
@GetExchange("/{idOrCode}")
34+
SubaccountResponse.Single fetchSubaccount(@PathVariable String idOrCode);
35+
36+
@PutExchange("/{idOrCode}")
37+
SubaccountResponse.Single updateSubaccount(@PathVariable String idOrCode, @RequestBody UpdateSubaccountRequest body);
38+
}

paystack-clients-spring-boot-starter/src/main/resources/application-paystack-clients-config.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ http:
2424

2525
product-client:
2626
url: "${base-url}/product"
27+
headers:
28+
Content-Type: "application/json"
29+
Authorization: "Bearer ${paystack-client.secret-key}"
30+
31+
subaccount-client:
32+
url: "${base-url}/subaccount"
2733
headers:
2834
Content-Type: "application/json"
2935
Authorization: "Bearer ${paystack-client.secret-key}"

paystack-clients/src/main/java/com/chrisworks/paystackclient/PaystackClient.java

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

3-
import com.chrisworks.paystackclient.definitions.ApplePayClient;
4-
import com.chrisworks.paystackclient.definitions.CustomerClient;
5-
import com.chrisworks.paystackclient.definitions.PlanClient;
6-
import com.chrisworks.paystackclient.definitions.ProductClient;
7-
import com.chrisworks.paystackclient.definitions.TransactionClient;
3+
import com.chrisworks.paystackclient.definitions.*;
84
import okhttp3.OkHttpClient;
95

106
public interface PaystackClient {
@@ -14,6 +10,7 @@ public interface PaystackClient {
1410
PlanClient plan();
1511
TransactionClient transaction();
1612
ProductClient product();
13+
SubaccountClient subaccount();
1714

1815
final class Impl extends WithConfiguredHttpClient implements PaystackClient {
1916
Impl(OkHttpClient httpClient) {
@@ -44,5 +41,10 @@ public TransactionClient transaction() {
4441
public ProductClient product() {
4542
return new ProductClient.Impl(httpClient);
4643
}
44+
45+
@Override
46+
public SubaccountClient subaccount() {
47+
return new SubaccountClient.Impl(httpClient);
48+
}
4749
}
4850
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.chrisworks.paystackclient.definitions;
2+
3+
import com.chrisworks.paystackclient.ExecutionSpec;
4+
import com.chrisworks.paystackclient.WithConfiguredHttpClient;
5+
import com.chrisworks.paystackclient.domain.Routes;
6+
import com.chrisworks.paystackclient.domain.subaccount.CreateSubaccountRequest;
7+
import com.chrisworks.paystackclient.domain.subaccount.SubaccountListQueryParam;
8+
import com.chrisworks.paystackclient.domain.subaccount.SubaccountResponse;
9+
import com.chrisworks.paystackclient.domain.subaccount.UpdateSubaccountRequest;
10+
import okhttp3.OkHttpClient;
11+
import okhttp3.Request;
12+
import okhttp3.RequestBody;
13+
import org.jetbrains.annotations.NotNull;
14+
15+
public interface SubaccountClient {
16+
17+
ExecutionSpec<SubaccountResponse.Single> createSubaccount(CreateSubaccountRequest body);
18+
19+
ExecutionSpec<SubaccountResponse.Multiple> listSubaccounts(SubaccountListQueryParam queryParam);
20+
21+
ExecutionSpec<SubaccountResponse.Single> fetchSubaccount(@NotNull String idOrCode);
22+
23+
ExecutionSpec<SubaccountResponse.Single> updateSubaccount(@NotNull String idOrCode, UpdateSubaccountRequest body);
24+
25+
final class Impl extends WithConfiguredHttpClient implements SubaccountClient {
26+
27+
public Impl(OkHttpClient httpClient) {
28+
super(httpClient);
29+
}
30+
31+
@Override
32+
public ExecutionSpec<SubaccountResponse.Single> createSubaccount(CreateSubaccountRequest body) {
33+
final Request request = new Request.Builder()
34+
.url(Routes.Subaccount.BASE_URL)
35+
.post(RequestBody.create(body.json(), applicationJson))
36+
.build();
37+
38+
return execSpec(request, SubaccountResponse.Single.class);
39+
}
40+
41+
@Override
42+
public ExecutionSpec<SubaccountResponse.Multiple> listSubaccounts(SubaccountListQueryParam queryParam) {
43+
final Request request = new Request.Builder()
44+
.url(Routes.Subaccount.BASE_URL + safeExtractQueryParams(queryParam))
45+
.get()
46+
.build();
47+
48+
return execSpec(request, SubaccountResponse.Multiple.class);
49+
}
50+
51+
@Override
52+
public ExecutionSpec<SubaccountResponse.Single> fetchSubaccount(@NotNull String idOrCode) {
53+
final Request request = new Request.Builder()
54+
.url(Routes.Subaccount.BY_ID_OR_CODE.apply(idOrCode))
55+
.get()
56+
.build();
57+
58+
return execSpec(request, SubaccountResponse.Single.class);
59+
}
60+
61+
@Override
62+
public ExecutionSpec<SubaccountResponse.Single> updateSubaccount(@NotNull String idOrCode,
63+
UpdateSubaccountRequest body) {
64+
final Request request = new Request.Builder()
65+
.url(Routes.Subaccount.BY_ID_OR_CODE.apply(idOrCode))
66+
.put(RequestBody.create(body.json(), applicationJson))
67+
.build();
68+
69+
return execSpec(request, SubaccountResponse.Single.class);
70+
}
71+
}
72+
}

paystack-domain/src/main/java/com/chrisworks/paystackclient/domain/Routes.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,10 @@ private Product(){}
4747
public static final String BASE_URL = Routes.BASE_URL + "/product";
4848
public static final UnaryOperator<String> BY_ID = (BASE_URL + "/%s")::formatted;
4949
}
50+
51+
public static final class Subaccount {
52+
private Subaccount(){}
53+
public static final String BASE_URL = Routes.BASE_URL + "/subaccount";
54+
public static final UnaryOperator<String> BY_ID_OR_CODE = (BASE_URL + "/%s")::formatted;
55+
}
5056
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.chrisworks.paystackclient.domain.subaccount;
2+
3+
import com.chrisworks.paystackclient.domain.request.RequestBody;
4+
5+
import java.math.BigDecimal;
6+
7+
public class CreateSubaccountRequest implements RequestBody<CreateSubaccountRequest> {
8+
private final String business_name;
9+
private final String settlement_bank;
10+
private final String account_number;
11+
private final BigDecimal percentage_charge;
12+
private final String description;
13+
private String primary_contact_email;
14+
private String primary_contact_name;
15+
private String primary_contact_phone;
16+
private String metadata;
17+
18+
public CreateSubaccountRequest(String businessName, String settlementBank, String accountNumber,
19+
BigDecimal percentageCharge, String description) {
20+
this.business_name = businessName;
21+
this.settlement_bank = settlementBank;
22+
this.account_number = accountNumber;
23+
this.percentage_charge = percentageCharge;
24+
this.description = description;
25+
}
26+
27+
public String getBusinessName() {
28+
return business_name;
29+
}
30+
31+
public String getSettlementBank() {
32+
return settlement_bank;
33+
}
34+
35+
public String getAccountNumber() {
36+
return account_number;
37+
}
38+
39+
public BigDecimal getPercentageCharge() {
40+
return percentage_charge;
41+
}
42+
43+
public String getDescription() {
44+
return description;
45+
}
46+
47+
public String getPrimaryContactEmail() {
48+
return primary_contact_email;
49+
}
50+
51+
public String getPrimaryContactName() {
52+
return primary_contact_name;
53+
}
54+
55+
public String getPrimaryContactPhone() {
56+
return primary_contact_phone;
57+
}
58+
59+
public String getMetadata() {
60+
return metadata;
61+
}
62+
63+
public CreateSubaccountRequest primaryContactEmail(String primaryContactEmail) {
64+
this.primary_contact_email = primaryContactEmail;
65+
return this;
66+
}
67+
68+
public CreateSubaccountRequest primaryContactName(String primaryContactName) {
69+
this.primary_contact_name = primaryContactName;
70+
return this;
71+
}
72+
73+
public CreateSubaccountRequest primaryContactPhone(String primaryContactPhone) {
74+
this.primary_contact_phone = primaryContactPhone;
75+
return this;
76+
}
77+
78+
public CreateSubaccountRequest metadata(String metadata) {
79+
this.metadata = metadata;
80+
return this;
81+
}
82+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.chrisworks.paystackclient.domain.subaccount;
2+
3+
import com.chrisworks.paystackclient.domain.request.PaystackListPagedQueryParam;
4+
import com.chrisworks.paystackclient.domain.request.QueryParamConstants;
5+
6+
import java.math.BigInteger;
7+
import java.time.ZonedDateTime;
8+
9+
public final class SubaccountListQueryParam extends PaystackListPagedQueryParam {
10+
11+
public SubaccountListQueryParam(BigInteger perPage, BigInteger page) {
12+
super(perPage, page);
13+
}
14+
15+
public SubaccountListQueryParam(){
16+
super();
17+
}
18+
19+
public SubaccountListQueryParam from(ZonedDateTime from){
20+
params.put(QueryParamConstants.FROM, from.toString());
21+
return this;
22+
}
23+
24+
public SubaccountListQueryParam to(ZonedDateTime to){
25+
params.put(QueryParamConstants.TO, to.toString());
26+
return this;
27+
}
28+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.chrisworks.paystackclient.domain.subaccount;
2+
3+
import com.chrisworks.paystackclient.domain.Email;
4+
import com.chrisworks.paystackclient.domain.response.PaystackMultiResponse;
5+
import com.chrisworks.paystackclient.domain.response.PaystackSingleResponse;
6+
7+
import java.math.BigDecimal;
8+
import java.math.BigInteger;
9+
import java.time.ZonedDateTime;
10+
import java.util.List;
11+
12+
public record SubaccountResponse(BigInteger integration, String domain, String subaccount_code, String business_name,
13+
String description, String primary_contact_name, Email primary_contact_email,
14+
String primary_contact_phone, Object metadata, BigDecimal percentage_charge,
15+
boolean is_verified, String settlement_bank, String account_number,
16+
String settlement_schedule, boolean active, boolean migrate, BigInteger id,
17+
ZonedDateTime createdAt, ZonedDateTime updatedAt) {
18+
19+
public record Single(boolean status, String message, SubaccountResponse data)
20+
implements PaystackSingleResponse<SubaccountResponse> {
21+
}
22+
23+
public record Multiple(boolean status, String message, List<SubaccountResponse> data, PageInfo.PageMetaInfo meta)
24+
implements PaystackMultiResponse<SubaccountResponse> {
25+
26+
}
27+
}

0 commit comments

Comments
 (0)