/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: MIT-0
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this
* software and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy, modify,
* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Threading.Tasks;
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using ModernTacoShop.SubmitOrder.Protos;
using ModernTacoShop.TrackOrder.Protos;
namespace AndroidApp.gRPC
{
public class TacoOrder
{
// Execute this delegate as a callback when the order status stream gets new data.
public delegate void OnOrderStatusChanged(ModernTacoShop.TrackOrder.Protos.Order orderStatus);
public TacoOrder() { }
public long OrderId { get; private set; }
public uint TacoCountBeef { get; set; }
public uint TacoCountCarnitas { get; set; }
public uint TacoCountChicken { get; set; }
public uint TacoCountShrimp { get; set; }
public uint TacoCountTofu { get; set; }
public string ServiceDomainName { get; set; }
public uint TotalTacoCount()
{
return TacoCountBeef + TacoCountCarnitas + TacoCountChicken + TacoCountShrimp + TacoCountTofu;
}
///
/// Submit this order to the gRPC service. Sets the Order ID.
///
public async Task SubmitOrder()
{
var channel = new Channel("submit-order." + ServiceDomainName, new SslCredentials());
var client = new SubmitOrder.SubmitOrderClient(channel);
OrderId = DateTime.UtcNow.Ticks;
_ = await client.SubmitOrderAsync(new ModernTacoShop.SubmitOrder.Protos.Order
{
OrderId = OrderId,
TacoCountBeef = TacoCountBeef,
TacoCountCarnitas = TacoCountCarnitas,
TacoCountChicken = TacoCountChicken,
TacoCountShrimp = TacoCountShrimp,
TacoCountTofu = TacoCountTofu,
PlacedOn = Timestamp.FromDateTime(DateTime.UtcNow)
});
}
///
/// Track the order status as it is streamed back from the gRPC service.
/// Execute the supplied callback whenever new data come in, passing in the latest data.
///
/// Execute this callback whenever new order status data come in from the stream.
public async Task StreamOrderStatus(OnOrderStatusChanged callback)
{
var channel = new Channel("track-order." + ServiceDomainName, new SslCredentials());
var client = new TrackOrder.TrackOrderClient(channel);
using (var call = client.GetOrderStatus(new OrderId { Id = OrderId }))
{
while (await call.ResponseStream.MoveNext())
{
var currentStatus = call.ResponseStream.Current;
callback(currentStatus);
}
}
}
public bool CanSubmit() =>
// The order can be submitted if there is at least 1 taco, and the service domain name is set.
!string.IsNullOrEmpty(ServiceDomainName) && TotalTacoCount() > 0;
}
}