diff --git a/DysonNetwork.Wallet/Payment/SubscriptionServiceGrpc.cs b/DysonNetwork.Wallet/Payment/SubscriptionServiceGrpc.cs new file mode 100644 index 00000000..44137fa1 --- /dev/null +++ b/DysonNetwork.Wallet/Payment/SubscriptionServiceGrpc.cs @@ -0,0 +1,97 @@ +using DysonNetwork.Shared.Models; +using DysonNetwork.Shared.Proto; +using DysonNetwork.Shared.Registry; +using Grpc.Core; + +namespace DysonNetwork.Wallet.Payment; + +public class SubscriptionServiceGrpc( + SubscriptionService subscriptionService, + IGrpcClientFactory accountsFactory +) : Shared.Proto.SubscriptionService.SubscriptionServiceBase +{ + private readonly AccountService.AccountServiceClient _accounts = accountsFactory.CreateClient(); + + public override async Task GetSubscription( + GetSubscriptionRequest request, + ServerCallContext context + ) + { + var subscription = await subscriptionService.GetSubscriptionAsync( + Guid.Parse(request.AccountId), + request.Identifier + ); + return subscription?.ToProtoValue() + ?? throw new RpcException(new Status(StatusCode.NotFound, "Subscription not found")); + } + + public override async Task GetPerkSubscription( + GetPerkSubscriptionRequest request, + ServerCallContext context + ) + { + var subscription = await subscriptionService.GetPerkSubscriptionAsync( + Guid.Parse(request.AccountId) + ); + return subscription?.ToProtoValue() + ?? throw new RpcException(new Status(StatusCode.NotFound, "Perk subscription not found")); + } + + public override async Task GetPerkSubscriptions( + GetPerkSubscriptionsRequest request, + ServerCallContext context + ) + { + var accountIds = request.AccountIds.Select(Guid.Parse).ToList(); + var subscriptions = await subscriptionService.GetPerkSubscriptionsAsync(accountIds); + + var response = new GetPerkSubscriptionsResponse(); + foreach (var subscription in subscriptions.Values) + { + if (subscription != null) + { + response.Subscriptions.Add(subscription.ToProtoValue()); + } + } + + return response; + } + + public override async Task CreateSubscription( + CreateSubscriptionRequest request, + ServerCallContext context + ) + { + var account = await _accounts.GetAccountAsync(new GetAccountRequest { Id = request.AccountId }); + + if (account == null) + { + throw new RpcException(new Status(StatusCode.NotFound, "Account not found")); + } + + var subscription = await subscriptionService.CreateSubscriptionAsync( + account, + request.Identifier, + request.PaymentMethod, + new SnPaymentDetails(), + null, + request.HasCouponCode ? request.CouponCode : null, + request.IsFreeTrial, + true + ); + + return subscription.ToProtoValue(); + } + + public override async Task CancelSubscription( + CancelSubscriptionRequest request, + ServerCallContext context + ) + { + var subscription = await subscriptionService.CancelSubscriptionAsync( + Guid.Parse(request.AccountId), + request.Identifier + ); + return subscription.ToProtoValue(); + } +} diff --git a/DysonNetwork.Wallet/Startup/ApplicationConfiguration.cs b/DysonNetwork.Wallet/Startup/ApplicationConfiguration.cs index b5240fad..ab642c1e 100644 --- a/DysonNetwork.Wallet/Startup/ApplicationConfiguration.cs +++ b/DysonNetwork.Wallet/Startup/ApplicationConfiguration.cs @@ -28,6 +28,7 @@ public static class ApplicationConfiguration { app.MapGrpcService(); app.MapGrpcService(); + app.MapGrpcService(); app.MapGrpcReflectionService(); return app;