public async Task <ChannelList> ListAsync(
            [GlobalParameter("subscriptionId")] string subscriptionId,
            [GlobalParameter("resourceGroupName")] string resourceGroupName,
            [GlobalParameter("accountName")] string accountName,
            [GlobalParameter("api-version"), FromQuery("api-version")] string apiVersion)
        {
            ApiVersionStore.ValidateApiVersion(apiVersion);
            Validator.ArgumentValidGuid(subscriptionId, nameof(subscriptionId));
            Validator.ArgumentNotNullOrrWhiteSpace(resourceGroupName, nameof(resourceGroupName));
            Validator.ArgumentNotNullOrrWhiteSpace(accountName, nameof(accountName));

            this.LogActionBegin();

            var result = new ChannelList
            {
                Channels = await this.accountManager.ListChannelsByAccountAsync(
                    this.Request.GetRequestId(),
                    subscriptionId,
                    resourceGroupName,
                    accountName)
            };

            this.LogActionEnd($"Total {result.Channels.Count()} channels returned");
            return(result);
        }
        public async Task <Channel> CreateOrUpdateAsync(
            [GlobalParameter("subscriptionId")] string subscriptionId,
            [GlobalParameter("resourceGroupName")] string resourceGroupName,
            [GlobalParameter("accountName")] string accountName,
            [GlobalParameter("channelName")] string channelName,
            [FromBody] Channel channel,
            [GlobalParameter("api-version"), FromQuery("api-version")] string apiVersion)
        {
            ApiVersionStore.ValidateApiVersion(apiVersion);
            Validator.ArgumentValidGuid(subscriptionId, nameof(subscriptionId));
            Validator.ArgumentNotNullOrrWhiteSpace(resourceGroupName, nameof(resourceGroupName));
            Validator.ArgumentNotNullOrrWhiteSpace(accountName, nameof(accountName));
            Validator.ArgumentNotNullOrrWhiteSpace(channelName, nameof(channelName));
            Validator.ArgumentNotNullOrrWhiteSpace(channel.Properties.ChannelType, nameof(channel.Properties.ChannelType));

            this.LogActionBegin($"Credential keys = {string.Join(",", channel.Properties.Credentials.Keys)}");

            var result = await this.accountManager.CreateOrUpdateChannelAsync(
                this.Request.GetRequestId(),
                subscriptionId,
                resourceGroupName,
                accountName,
                channelName,
                channel);

            this.LogActionEnd($"Credential keys = {string.Join(",", result.Properties.Credentials.Keys)}");
            return(result);
        }
        public async Task <Account> CreateOrUpdateAsync(
            [GlobalParameter("subscriptionId")] string subscriptionId,
            [GlobalParameter("resourceGroupName")] string resourceGroupName,
            [GlobalParameter("accountName")] string accountName,
            [FromBody] Account account,
            [GlobalParameter("api-version"), FromQuery("api-version")] string apiVersion)
        {
            ApiVersionStore.ValidateApiVersion(apiVersion);
            Validator.ArgumentValidGuid(subscriptionId, nameof(subscriptionId));
            Validator.ArgumentNotNullOrrWhiteSpace(resourceGroupName, nameof(resourceGroupName));
            Validator.ArgumentNotNullOrrWhiteSpace(accountName, nameof(accountName));
            Validator.ArgumentNotNullOrrWhiteSpace(account.SKU.Name, account.SKU.Name);
            Validator.ArgumentNotNullOrrWhiteSpace(account.Location, nameof(account.Location));

            this.LogActionBegin(
                $"Location = {account.Location}\n" +
                $"SKU = {account.SKU?.Name}\n" +
                $"Tags = {this.SerializeTags(account.Tags)}");

            var result = await this.accountManager.CreateOrUpdateAccountAsync(
                this.Request.GetRequestId(),
                subscriptionId,
                resourceGroupName,
                accountName,
                account);

            this.LogActionEnd(
                $"Resource ID = {result.Id}\n" +
                $"Location = {result.Location}\n" +
                $"SKU = {result.SKU?.Name}\n" +
                $"Tags = {this.SerializeTags(result.Tags)}");
            return(result);
        }
        public async Task <OperationList> ListAsync(
            [GlobalParameter("api-version"), FromQuery("api-version")] string apiVersion)
        {
            ApiVersionStore.ValidateApiVersion(apiVersion);

            return(await Task.FromResult(new OperationList
            {
                Operations = OperationStore.Operations
            }));
        }
        public async Task <AccountList> ListAsync(
            [GlobalParameter("subscriptionId")] string subscriptionId,
            [GlobalParameter("api-version"), FromQuery("api-version")] string apiVersion)
        {
            ApiVersionStore.ValidateApiVersion(apiVersion);
            Validator.ArgumentValidGuid(subscriptionId, nameof(subscriptionId));

            this.LogActionBegin();

            var result = new AccountList
            {
                Accounts = await this.accountManager.ListAccountsAsync(
                    this.Request.GetRequestId(),
                    subscriptionId)
            };

            this.LogActionEnd($"Total {result.Accounts.Count()} accounts returned");
            return(result);
        }
        public async Task <ChannelTypeDescriptionList> ListChannelTypesAsync(
            [GlobalParameter("subscriptionId")] string subscriptionId,
            [GlobalParameter("resourceGroupName")] string resourceGroupName,
            [GlobalParameter("accountName")] string accountName,
            [GlobalParameter("api-version"), FromQuery("api-version")] string apiVersion)
        {
            ApiVersionStore.ValidateApiVersion(apiVersion);
            Validator.ArgumentValidGuid(subscriptionId, nameof(subscriptionId));
            Validator.ArgumentNotNullOrrWhiteSpace(resourceGroupName, nameof(resourceGroupName));
            Validator.ArgumentNotNullOrrWhiteSpace(accountName, nameof(accountName));

            this.LogActionBegin();

            var result = await Task.FromResult(new ChannelTypeDescriptionList
            {
                Descriptions = ChannelTypeStore.Descriptions
            });

            this.LogActionEnd($"Total {result.Descriptions.Count()} channel types returned");
            return(result);
        }
        public async Task <KeyDescription> RegenerateKeyAsync(
            [GlobalParameter("subscriptionId")] string subscriptionId,
            [GlobalParameter("resourceGroupName")] string resourceGroupName,
            [GlobalParameter("accountName")] string accountName,
            [FromBody] RegenerateKeyParameter parameter,
            [GlobalParameter("api-version"), FromQuery("api-version")] string apiVersion)
        {
            if (!this.ModelState.IsValid)
            {
                var error = this.ModelState.Values
                            .SelectMany(s => s.Errors)
                            .FirstOrDefault();

                throw new InvalidArgumentException(error?.Exception?.Message ?? "Invalid model");
            }

            ApiVersionStore.ValidateApiVersion(apiVersion);
            Validator.ArgumentValidGuid(subscriptionId, nameof(subscriptionId));
            Validator.ArgumentNotNullOrrWhiteSpace(resourceGroupName, nameof(resourceGroupName));
            Validator.ArgumentNotNullOrrWhiteSpace(accountName, nameof(accountName));
            Validator.ArgumentNotNullOrrWhiteSpace(parameter.Name, nameof(parameter.Name));

            this.LogActionBegin(
                $"Key name = {parameter.Name}\n" +
                $"Key rank = {parameter.Rank}");

            var result = await this.accountManager.RegenerateKeyAsync(
                this.Request.GetRequestId(),
                subscriptionId,
                resourceGroupName,
                accountName,
                parameter);

            this.LogActionEnd();
            return(result);
        }