diff --git a/packages/shorebird_cli/lib/src/command_runner.dart b/packages/shorebird_cli/lib/src/command_runner.dart index 607b88cd..ab84bb86 100644 --- a/packages/shorebird_cli/lib/src/command_runner.dart +++ b/packages/shorebird_cli/lib/src/command_runner.dart @@ -68,7 +68,6 @@ class ShorebirdCliCommandRunner extends CompletionCommandRunner { addCommand(ReleaseCommand()); addCommand(ReleasesCommand()); addCommand(RunCommand()); - addCommand(SubscriptionCommand()); addCommand(UpgradeCommand()); } diff --git a/packages/shorebird_cli/lib/src/commands/account/account.dart b/packages/shorebird_cli/lib/src/commands/account/account.dart index dd08ed0c..f30e7e80 100644 --- a/packages/shorebird_cli/lib/src/commands/account/account.dart +++ b/packages/shorebird_cli/lib/src/commands/account/account.dart @@ -1,4 +1,5 @@ export 'account_command.dart'; export 'account_usage_command.dart'; export 'create_account_command.dart'; +export 'downgrade_account_command.dart'; export 'upgrade_account_command.dart'; diff --git a/packages/shorebird_cli/lib/src/commands/account/account_command.dart b/packages/shorebird_cli/lib/src/commands/account/account_command.dart index 99e3c7b7..b18a5730 100644 --- a/packages/shorebird_cli/lib/src/commands/account/account_command.dart +++ b/packages/shorebird_cli/lib/src/commands/account/account_command.dart @@ -10,6 +10,7 @@ class AccountCommand extends ShorebirdCommand { AccountCommand() { addSubcommand(AccountUsageCommand()); addSubcommand(CreateAccountCommand()); + addSubcommand(DowngradeAccountCommand()); addSubcommand(UpgradeAccountCommand()); } diff --git a/packages/shorebird_cli/lib/src/commands/subscription/cancel_subscription_command.dart b/packages/shorebird_cli/lib/src/commands/account/downgrade_account_command.dart similarity index 67% rename from packages/shorebird_cli/lib/src/commands/subscription/cancel_subscription_command.dart rename to packages/shorebird_cli/lib/src/commands/account/downgrade_account_command.dart index 1480939f..56f790b7 100644 --- a/packages/shorebird_cli/lib/src/commands/subscription/cancel_subscription_command.dart +++ b/packages/shorebird_cli/lib/src/commands/account/downgrade_account_command.dart @@ -10,22 +10,20 @@ import 'package:shorebird_cli/src/shorebird_environment.dart'; import 'package:shorebird_cli/src/shorebird_validation_mixin.dart'; import 'package:shorebird_code_push_client/shorebird_code_push_client.dart'; -class CancelSubscriptionCommand extends ShorebirdCommand +class DowngradeAccountCommand extends ShorebirdCommand with ShorebirdConfigMixin, ShorebirdValidationMixin { - CancelSubscriptionCommand({super.buildCodePushClient}); + DowngradeAccountCommand({super.buildCodePushClient}); @override - String get name => 'cancel'; + String get name => 'downgrade'; @override - String get description => 'Cancel your Shorebird subscription.'; + String get description => 'Downgrade your Shorebird account.'; @override Future run() async { try { - await validatePreconditions( - checkUserIsAuthenticated: true, - ); + await validatePreconditions(checkUserIsAuthenticated: true); } on PreconditionFailedException catch (e) { return e.exitCode.code; } @@ -48,36 +46,39 @@ class CancelSubscriptionCommand extends ShorebirdCommand } if (!user.hasActiveSubscription) { - logger.err('You do not have an active subscription.'); + logger.err('You do not have a "teams" subscription.'); return ExitCode.software.code; } final confirm = logger.confirm( - red.wrap('This will cancel your Shorebird subscription. Are you sure?'), + red.wrap( + '''This will downgrade your Shorebird plan to the "hobby" tier. Are you sure?''', + ), ); + if (!confirm) { logger.info('Aborting.'); return ExitCode.success.code; } - final progress = logger.progress('Canceling your subscription'); + final progress = logger.progress('Downgrading your plan'); final DateTime cancellationDate; try { cancellationDate = await client.cancelSubscription(); } catch (error) { - progress.fail('Failed to cancel subscription. Error: $error'); + progress.fail('Failed to downgrade plan. Error: $error'); return ExitCode.software.code; } final formattedDate = DateFormat.yMMMMd().format(cancellationDate); progress.complete( ''' -Your subscription has been canceled. +Your plan has been downgraded. -Note: Your access to Shorebird will continue until $formattedDate, after which all data stored by Shorebird will be deleted as per our privacy policy: https://shorebird.dev/privacy.html. +Note: Your current plan will continue until $formattedDate, after which your account will be on the "hobby" tier. -Apps on devices you've built with Shorebird will continue to function normally, but will not receive further updates.''', +Apps on devices you've built with Shorebird will continue to function normally, but will be subject to the limits of the "hobby" tier.''', ); return ExitCode.success.code; diff --git a/packages/shorebird_cli/lib/src/commands/commands.dart b/packages/shorebird_cli/lib/src/commands/commands.dart index 31e34146..2d37fca4 100644 --- a/packages/shorebird_cli/lib/src/commands/commands.dart +++ b/packages/shorebird_cli/lib/src/commands/commands.dart @@ -12,5 +12,4 @@ export 'patch/patch.dart'; export 'release/release.dart'; export 'releases/releases.dart'; export 'run_command.dart'; -export 'subscription/subscription_command.dart'; export 'upgrade_command.dart'; diff --git a/packages/shorebird_cli/lib/src/commands/subscription/subscription.dart b/packages/shorebird_cli/lib/src/commands/subscription/subscription.dart deleted file mode 100644 index 61a63345..00000000 --- a/packages/shorebird_cli/lib/src/commands/subscription/subscription.dart +++ /dev/null @@ -1 +0,0 @@ -export 'cancel_subscription_command.dart'; diff --git a/packages/shorebird_cli/lib/src/commands/subscription/subscription_command.dart b/packages/shorebird_cli/lib/src/commands/subscription/subscription_command.dart deleted file mode 100644 index dc03e985..00000000 --- a/packages/shorebird_cli/lib/src/commands/subscription/subscription_command.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:shorebird_cli/src/command.dart'; -import 'package:shorebird_cli/src/commands/subscription/subscription.dart'; - -/// {@template subscription_command} -/// -/// `shorebird subscription` -/// Manage your Shorebird subscription. -/// {@endtemplate} -class SubscriptionCommand extends ShorebirdCommand { - /// {@macro subscription_command} - SubscriptionCommand() { - addSubcommand(CancelSubscriptionCommand()); - } - - @override - String get name => 'subscription'; - - @override - String get description => 'Manage your Shorebird subscription.'; -} diff --git a/packages/shorebird_cli/test/src/commands/subscription/cancel_subscription_command_test.dart b/packages/shorebird_cli/test/src/commands/account/downgrade_account_command_test.dart similarity index 82% rename from packages/shorebird_cli/test/src/commands/subscription/cancel_subscription_command_test.dart rename to packages/shorebird_cli/test/src/commands/account/downgrade_account_command_test.dart index 27707505..d72bf5fb 100644 --- a/packages/shorebird_cli/test/src/commands/subscription/cancel_subscription_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/account/downgrade_account_command_test.dart @@ -3,7 +3,7 @@ import 'package:mason_logger/mason_logger.dart'; import 'package:mocktail/mocktail.dart'; import 'package:scoped/scoped.dart'; import 'package:shorebird_cli/src/auth/auth.dart'; -import 'package:shorebird_cli/src/commands/subscription/cancel_subscription_command.dart'; +import 'package:shorebird_cli/src/commands/account/account.dart'; import 'package:shorebird_cli/src/logger.dart'; import 'package:shorebird_code_push_client/shorebird_code_push_client.dart'; import 'package:test/test.dart'; @@ -19,7 +19,7 @@ class _MockLogger extends Mock implements Logger {} class _MockProgress extends Mock implements Progress {} void main() { - group(CancelSubscriptionCommand, () { + group(DowngradeAccountCommand, () { const noSubscriptionUser = User(id: 1, email: 'tester1@shorebird.dev'); const subscriptionUser = User( id: 2, @@ -32,7 +32,7 @@ void main() { late http.Client httpClient; late Logger logger; late Progress progress; - late CancelSubscriptionCommand command; + late DowngradeAccountCommand command; R runWithOverrides(R Function() body) { return runScoped( @@ -56,7 +56,7 @@ void main() { when(() => logger.progress(any())).thenReturn(progress); command = runWithOverrides( - () => CancelSubscriptionCommand( + () => DowngradeAccountCommand( buildCodePushClient: ({ required http.Client httpClient, Uri? hostedUri, @@ -123,7 +123,7 @@ void main() { expect(result, ExitCode.software.code); verify( () => logger.err( - any(that: contains('You do not have an active subscription')), + any(that: contains('You do not have a "teams" subscription')), ), ).called(1); }, @@ -135,13 +135,7 @@ void main() { () => codePushClient.getCurrentUser(), ).thenAnswer((_) async => subscriptionUser); when( - () => logger.confirm( - any( - that: contains( - 'This will cancel your Shorebird subscription. Are you sure?', - ), - ), - ), + () => logger.confirm(any(that: contains('Are you sure?'))), ).thenReturn(false); final result = await runWithOverrides(command.run); @@ -156,13 +150,7 @@ void main() { () => codePushClient.getCurrentUser(), ).thenAnswer((_) async => subscriptionUser); when( - () => logger.confirm( - any( - that: contains( - 'This will cancel your Shorebird subscription. Are you sure?', - ), - ), - ), + () => logger.confirm(any(that: contains('Are you sure?'))), ).thenReturn(true); when(() => codePushClient.cancelSubscription()).thenThrow( Exception('an error occurred'), @@ -172,9 +160,7 @@ void main() { expect(result, ExitCode.software.code); verify( - () => progress.fail( - any(that: contains('an error occurred')), - ), + () => progress.fail(any(that: contains('an error occurred'))), ).called(1); }); @@ -183,16 +169,11 @@ void main() { const cancellationTimestamp = 1681455600; when(() => auth.isAuthenticated).thenReturn(true); - when(() => codePushClient.getCurrentUser()) - .thenAnswer((_) async => subscriptionUser); when( - () => logger.confirm( - any( - that: contains( - 'This will cancel your Shorebird subscription. Are you sure?', - ), - ), - ), + () => codePushClient.getCurrentUser(), + ).thenAnswer((_) async => subscriptionUser); + when( + () => logger.confirm(any(that: contains('Are you sure?'))), ).thenReturn(true); when(() => codePushClient.cancelSubscription()).thenAnswer( @@ -209,8 +190,8 @@ void main() { () => progress.complete( any( that: stringContainsInOrder([ - 'Your subscription has been canceled.', - 'Your access to Shorebird will continue until April 14, 2023' + 'Your plan has been downgraded.', + '''Note: Your current plan will continue until April 14, 2023, after which your account will be on the "hobby" tier.''' ]), ), ),