From 679c59218bf75e02cd50b8a9b9771f0224078df6 Mon Sep 17 00:00:00 2001 From: Bryan Oltman Date: Mon, 24 Apr 2023 11:42:13 -0400 Subject: [PATCH] feat(code_push_protocol): add subscription object to user (#339) --- .../lib/src/models/models.dart | 1 + .../lib/src/models/subscription.dart | 36 ++++++++++++++++++ .../lib/src/models/subscription.g.dart | 36 ++++++++++++++++++ .../test/src/models/subscription_test.dart | 38 +++++++++++++++++++ .../test/src/models/user_test.dart | 5 ++- 5 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 packages/shorebird_code_push_protocol/lib/src/models/subscription.dart create mode 100644 packages/shorebird_code_push_protocol/lib/src/models/subscription.g.dart create mode 100644 packages/shorebird_code_push_protocol/test/src/models/subscription_test.dart diff --git a/packages/shorebird_code_push_protocol/lib/src/models/models.dart b/packages/shorebird_code_push_protocol/lib/src/models/models.dart index 6c74306c..7cb4f1d5 100644 --- a/packages/shorebird_code_push_protocol/lib/src/models/models.dart +++ b/packages/shorebird_code_push_protocol/lib/src/models/models.dart @@ -6,4 +6,5 @@ export 'patch.dart'; export 'patch_artifact.dart'; export 'release.dart'; export 'release_artifact.dart'; +export 'subscription.dart'; export 'user.dart'; diff --git a/packages/shorebird_code_push_protocol/lib/src/models/subscription.dart b/packages/shorebird_code_push_protocol/lib/src/models/subscription.dart new file mode 100644 index 00000000..1daf06fc --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/models/subscription.dart @@ -0,0 +1,36 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart'; + +part 'subscription.g.dart'; + +/// {@template subscription} +/// A user's Shorebird subscription. +/// {@endtemplate} +@JsonSerializable() +class Subscription { + /// {@macro subscription} + Subscription({ + required this.cost, + required this.paidThroughDate, + required this.willRenew, + }); + + /// Creates a [Subscription] from a JSON object. + factory Subscription.fromJson(Json json) => _$SubscriptionFromJson(json); + + /// Converts a [Subscription] to a JSON object. + Json toJson() => _$SubscriptionToJson(this); + + /// Billing rate, in cents. + final int cost; + + /// When the subscription will be renewed or expire. + @TimestampConverter() + final DateTime paidThroughDate; + + /// Whether this subscription will renew on [paidThroughDate]. + final bool willRenew; + + /// Whether this subscription is currently active. + bool get isActive => paidThroughDate.isAfter(DateTime.now()); +} diff --git a/packages/shorebird_code_push_protocol/lib/src/models/subscription.g.dart b/packages/shorebird_code_push_protocol/lib/src/models/subscription.g.dart new file mode 100644 index 00000000..5568361e --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/models/subscription.g.dart @@ -0,0 +1,36 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ignore_for_file: implicit_dynamic_parameter, require_trailing_commas, cast_nullable_to_non_nullable, lines_longer_than_80_chars + +part of 'subscription.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Subscription _$SubscriptionFromJson(Map json) => + $checkedCreate( + 'Subscription', + json, + ($checkedConvert) { + final val = Subscription( + cost: $checkedConvert('cost', (v) => v as int), + paidThroughDate: $checkedConvert('paid_through_date', + (v) => const TimestampConverter().fromJson(v as int)), + willRenew: $checkedConvert('will_renew', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'paidThroughDate': 'paid_through_date', + 'willRenew': 'will_renew' + }, + ); + +Map _$SubscriptionToJson(Subscription instance) => + { + 'cost': instance.cost, + 'paid_through_date': + const TimestampConverter().toJson(instance.paidThroughDate), + 'will_renew': instance.willRenew, + }; diff --git a/packages/shorebird_code_push_protocol/test/src/models/subscription_test.dart b/packages/shorebird_code_push_protocol/test/src/models/subscription_test.dart new file mode 100644 index 00000000..bc30aa11 --- /dev/null +++ b/packages/shorebird_code_push_protocol/test/src/models/subscription_test.dart @@ -0,0 +1,38 @@ +import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart'; +import 'package:test/test.dart'; + +void main() { + group(Subscription, () { + test('can be (de)serialized', () { + final subscription = Subscription( + cost: 100, + paidThroughDate: DateTime.now(), + willRenew: true, + ); + expect( + Subscription.fromJson(subscription.toJson()).toJson(), + equals(subscription.toJson()), + ); + }); + + group('isActive', () { + test('returns true if paidThroughDate is in the future', () { + final subscription = Subscription( + cost: 100, + paidThroughDate: DateTime.now().add(const Duration(days: 1)), + willRenew: true, + ); + expect(subscription.isActive, isTrue); + }); + + test('returns false if paidThroughDate is in the past', () { + final subscription = Subscription( + cost: 100, + paidThroughDate: DateTime.now().subtract(const Duration(days: 1)), + willRenew: true, + ); + expect(subscription.isActive, isFalse); + }); + }); + }); +} diff --git a/packages/shorebird_code_push_protocol/test/src/models/user_test.dart b/packages/shorebird_code_push_protocol/test/src/models/user_test.dart index 67d8e04f..6b7704f8 100644 --- a/packages/shorebird_code_push_protocol/test/src/models/user_test.dart +++ b/packages/shorebird_code_push_protocol/test/src/models/user_test.dart @@ -4,7 +4,10 @@ import 'package:test/test.dart'; void main() { group('User', () { test('can be (de)serialized', () { - const user = User(id: 1, email: 'test@shorebird.dev'); + const user = User( + id: 1, + email: 'test@shorebird.dev', + ); expect( User.fromJson(user.toJson()).toJson(), equals(user.toJson()),