Skip to content

Commit

Permalink
subscription expansion
Browse files Browse the repository at this point in the history
yurii-prykhodko-solid committed Aug 23, 2024
1 parent 62c3d03 commit ee7c46c
Showing 9 changed files with 83 additions and 87 deletions.
3 changes: 1 addition & 2 deletions lib/messages.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:stripe/src/messages/converters.dart';
import 'package:stripe/src/messages/enums.dart';
import 'package:stripe/src/messages/enums/pause_collection_behavior.dart';

export 'package:stripe/src/messages/enums.dart';

@@ -19,8 +18,8 @@ part 'src/messages/data_list.dart';
part 'src/messages/discount.dart';
part 'src/messages/event.dart';
part 'src/messages/invoice.dart';
part 'src/messages/payment_intent.dart';
part 'src/messages/pause_collection.dart';
part 'src/messages/payment_intent.dart';
part 'src/messages/payment_method.dart';
part 'src/messages/portal_session.dart';
part 'src/messages/price.dart';
9 changes: 9 additions & 0 deletions lib/src/expanded/customer_expanded.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'package:stripe/messages.dart';

class CustomerExpanded {
final Customer customer;

CustomerExpanded({
required this.customer,
});
}
35 changes: 2 additions & 33 deletions lib/src/expanded/subscription_expanded.dart
Original file line number Diff line number Diff line change
@@ -1,48 +1,17 @@
import 'package:stripe/messages.dart';
import 'package:stripe/src/expanded.dart';
import 'package:stripe/src/utils/expandable_fields/customer_expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/discounts_expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/latest_invoice_expandable_field.dart';
import 'package:stripe/src/expanded/customer_expanded.dart';

class SubscriptionExpanded {
final Subscription subscription;
final List<Discount>? discounts;
final InvoiceExpanded? latestInvoice;
final Customer? customer;
final CustomerExpanded? customer;

SubscriptionExpanded({
required this.subscription,
this.discounts,
this.latestInvoice,
this.customer,
});

factory SubscriptionExpanded.fromJson(
Map<String, dynamic> json,
Set<SubscriptionExpandableField> expand,
) {
List<Discount>? discounts;
if (expand.contains(SubscriptionExpandableField.discounts)) {
discounts = const DiscountsExpandableField().extract(json);
}

InvoiceExpanded? latestInvoice;
if (expand.contains(SubscriptionExpandableField.latestInvoice)) {
latestInvoice = const LatestInvoiceExpandableField(

).extract(json);
}

Customer? customer;
if (expand.contains(SubscriptionExpandableField.customer)) {
customer = const CustomerExpandableField().extract(json);
}

return SubscriptionExpanded(
subscription: Subscription.fromJson(json),
discounts: discounts,
latestInvoice: latestInvoice,
customer: customer,
);
}
}
1 change: 0 additions & 1 deletion lib/src/messages/enums.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export 'enums/expandable_fields/subscription_expandable_field.dart';
export 'enums/payment_behavior.dart';
export 'enums/proration_behavior.dart';
export 'enums/stripe_api_error_type.dart';

This file was deleted.

53 changes: 11 additions & 42 deletions lib/src/resources/subscription.dart
Original file line number Diff line number Diff line change
@@ -2,11 +2,9 @@ import 'dart:async';

import 'package:stripe/messages.dart';
import 'package:stripe/src/expanded.dart';
import 'package:stripe/src/utils/expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/customer_expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/discounts_expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/latest_invoice_expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/payment_intent_expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/subscription_expandable_field.dart';

import '../client.dart';
import '_resource.dart';
@@ -20,10 +18,10 @@ class SubscriptionResource extends Resource<Subscription> {
Future<SubscriptionExpanded> create(CreateSubscriptionRequest request) async {
final response = await post(_resourceName, data: request.toJson());

return SubscriptionExpanded.fromJson(response, {
SubscriptionExpandableField.discounts,
SubscriptionExpandableField.latestInvoice,
});
return SubscriptionExpandableField(
discountsExpansion: DiscountsExpandableField(),
latestInvoiceExpansion: LatestInvoiceExpandableField(),
).extract(response)!;
}

Future<Subscription> retrieve(String id) async {
@@ -33,40 +31,16 @@ class SubscriptionResource extends Resource<Subscription> {

Future<SubscriptionExpanded> retrieveExpanded(
String id, {
required Set<SubscriptionExpandableField> expand,
required SubscriptionExpandableField expand,
}) async {
final expandableFields = _expandableFields(expand);
final response = await get(
'$_resourceName/$id',
queryParameters: {
'expand': expandableFields.map((e) => e.field).toList(),
'expand': expand.nestedFieldPaths.toList(),
},
);

return SubscriptionExpanded.fromJson(response, expand);
}

Iterable<ExpandableField> _expandableFields(
Set<SubscriptionExpandableField> fields,
) {
return fields.map(
(field) => _expandableField(field),
);
}

ExpandableField _expandableField(
SubscriptionExpandableField field,
) {
switch (field) {
case SubscriptionExpandableField.discounts:
return DiscountsExpandableField();
case SubscriptionExpandableField.latestInvoice:
return LatestInvoiceExpandableField(
paymentIntentExpansion: PaymentIntentExpandableField(),
);
case SubscriptionExpandableField.customer:
return CustomerExpandableField();
}
return expand.extract(response)!;
}

Future<DataList<Subscription>> list(
@@ -77,25 +51,20 @@ class SubscriptionResource extends Resource<Subscription> {
}

Future<DataList<SubscriptionExpanded>> listExpanded({
required Set<SubscriptionExpandableField> expand,
required SubscriptionExpandableField expand,
ListSubscriptionsRequest? request,
}) async {
final expandableFields = _expandableFields(expand);

final response = await get(
_resourceName,
queryParameters: {
...?request?.toJson(),
'expand': expandableFields.map((e) => 'data.${e.field}').toList(),
'expand': expand.nestedFieldPaths.toList(),
},
);

return DataList<SubscriptionExpanded>.fromJson(
response,
(value) => SubscriptionExpanded.fromJson(
value as Map<String, dynamic>,
expand,
),
(value) => expand.extract(value as Map<String, Object?>)!,
);
}

Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import 'package:stripe/messages.dart';
import 'package:stripe/src/expanded/customer_expanded.dart';
import 'package:stripe/src/utils/expandable_object_field.dart';

class CustomerExpandableField extends ExpandableObjectField<Customer> {
class CustomerExpandableField extends ExpandableObjectField<CustomerExpanded> {
@override
String get field => 'customer';

const CustomerExpandableField();

@override
Customer parse(Map<String, dynamic> object) => Customer.fromJson(object);
CustomerExpanded parse(Map<String, dynamic> object) =>
CustomerExpanded(customer: Customer.fromJson(object));

@override
String replacement(Customer parsedValue) => parsedValue.id;
String replacement(CustomerExpanded parsedValue) => parsedValue.customer.id;
}
Original file line number Diff line number Diff line change
@@ -15,7 +15,7 @@ class InvoiceExpandableField extends ExpandableObjectField<InvoiceExpanded> {
Iterable<String> get nestedFields => [
...?paymentIntentExpansion?.nestedFieldPaths,
...?discountsExpansion?.nestedFieldPaths,
].nonNulls;
];

const InvoiceExpandableField({
this.paymentIntentExpansion,
54 changes: 54 additions & 0 deletions lib/src/utils/expandable_fields/subscription_expandable_field.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// ignore_for_file: false
import 'package:stripe/messages.dart';
import 'package:stripe/src/expanded/customer_expanded.dart';
import 'package:stripe/src/expanded/invoice_expanded.dart';
import 'package:stripe/src/expanded/subscription_expanded.dart';
import 'package:stripe/src/utils/expandable_fields/customer_expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/discounts_expandable_field.dart';
import 'package:stripe/src/utils/expandable_fields/latest_invoice_expandable_field.dart';
import 'package:stripe/src/utils/expandable_object_field.dart';

class SubscriptionExpandableField
extends ExpandableObjectField<SubscriptionExpanded> {
DiscountsExpandableField? discountsExpansion;
LatestInvoiceExpandableField? latestInvoiceExpansion;
CustomerExpandableField? customerExpansion;

SubscriptionExpandableField({
this.discountsExpansion,
this.latestInvoiceExpansion,
this.customerExpansion,
});

@override
String get field => 'customer';

@override
SubscriptionExpanded parse(Map<String, dynamic> object) {
List<Discount>? discounts;
if (discountsExpansion != null) {
discounts = discountsExpansion!.extract(object);
}

InvoiceExpanded? latestInvoice;
if (latestInvoiceExpansion != null) {
latestInvoice = latestInvoiceExpansion!.extract(object);
}

CustomerExpanded? customer;
if (customerExpansion != null) {
customer = customerExpansion!.extract(object);
}

return SubscriptionExpanded(
subscription: Subscription.fromJson(object),
discounts: discounts,
latestInvoice: latestInvoice,
customer: customer,
);
}

@override
String replacement(SubscriptionExpanded parsedValue) =>
parsedValue.subscription.id;
}

0 comments on commit ee7c46c

Please sign in to comment.