public async Task <ReminderEntry> ReadRow(GrainReference grainRef, string reminderName)
        {
            try
            {
                var response = await ExecuteWithRetries(async() =>
                {
                    var pk = new PartitionKey(ReminderEntity.ConstructPartitionKey(this._serviceId, grainRef));

                    ItemResponse <ReminderEntity> response = null;
                    try
                    {
                        response = await this._container.ReadItemAsync <ReminderEntity>(
                            ReminderEntity.ConstructId(grainRef, reminderName), pk);
                    }
                    catch (CosmosException ce) when(ce.StatusCode == HttpStatusCode.NotFound)
                    {
                        return(null);
                    }

                    return(response.Resource);
                }).ConfigureAwait(false);

                return(response != null?this.FromEntity(response) : null);
            }
            catch (Exception exc)
            {
                this._logger.LogError(exc, $"Failure reading reminder {reminderName} for service {this._serviceId} and grain {grainRef.ToKeyString()}.");
                throw;
            }
        }
        public async Task <bool> RemoveRow(GrainReference grainRef, string reminderName, string eTag)
        {
            try
            {
                var response = await ExecuteWithRetries(() =>
                {
                    var pk = new PartitionKey(ReminderEntity.ConstructPartitionKey(this._serviceId, grainRef));

                    return(this._container.DeleteItemAsync <ReminderEntity>(
                               ReminderEntity.ConstructId(grainRef, reminderName),
                               pk,
                               new ItemRequestOptions {
                        IfMatchEtag = eTag
                    }
                               ));
                }).ConfigureAwait(false);

                return(true);
            }
            catch (CosmosException dce) when(dce.StatusCode == HttpStatusCode.PreconditionFailed)
            {
                return(false);
            }
            catch (Exception exc)
            {
                this._logger.LogError(exc, $"Failure removing reminders for Service {this._serviceId} with grainId {grainRef.ToKeyString()} and name {reminderName}.");
                throw;
            }
        }
        public async Task <string> UpsertRow(ReminderEntry entry)
        {
            try
            {
                ReminderEntity entity = this.ToEntity(entry);

                var response = await ExecuteWithRetries(() =>
                {
                    var pk = new PartitionKey(ReminderEntity.ConstructPartitionKey(this._serviceId, entry.GrainRef));

                    return(this._container.UpsertItemAsync(
                               entity,
                               pk,
                               new ItemRequestOptions {
                        IfMatchEtag = entry.ETag
                    }
                               ));
                }).ConfigureAwait(false);

                return(response.Resource.ETag);
            }
            catch (Exception exc)
            {
                this._logger.LogError(exc, $"Failure to upsert reminder for Service {this._serviceId}.");
                throw;
            }
        }
 private ReminderEntity ToEntity(ReminderEntry entry)
 {
     return(new ReminderEntity
     {
         Id = ReminderEntity.ConstructId(entry.GrainRef, entry.ReminderName),
         PartitionKey = ReminderEntity.ConstructPartitionKey(this._serviceId, entry.GrainRef),
         ServiceId = this._serviceId,
         GrainHash = entry.GrainRef.GetUniformHashCode(),
         GrainId = entry.GrainRef.ToKeyString(),
         Name = entry.ReminderName,
         StartAt = entry.StartAt,
         Period = entry.Period
     });
 }
        public async Task <ReminderTableData> ReadRows(GrainReference grainRef)
        {
            try
            {
                var response = await ExecuteWithRetries(async() =>
                {
                    var pk = new PartitionKey(ReminderEntity.ConstructPartitionKey(this._serviceId, grainRef));

                    var query = this._container.GetItemLinqQueryable <ReminderEntity>(
                        requestOptions: new QueryRequestOptions {
                        PartitionKey = new PartitionKey(ReminderEntity.ConstructPartitionKey(this._serviceId, grainRef))
                    }
                        ).ToFeedIterator();

                    var reminders       = new List <ReminderEntity>();
                    string continuation = string.Empty;
                    do
                    {
                        var queryResponse = await query.ReadNextAsync();
                        if (queryResponse != null && queryResponse.Count > 0)
                        {
                            reminders.AddRange(queryResponse.ToArray());
                        }
                        else
                        {
                            break;
                        }
                    } while (query.HasMoreResults);

                    return(reminders);
                }).ConfigureAwait(false);

                return(new ReminderTableData(response.Select(this.FromEntity)));
            }
            catch (Exception exc)
            {
                this._logger.LogError(exc, $"Failure reading reminders for Grain Type {grainRef.InterfaceName} with Id {grainRef.ToKeyString()}.");
                throw;
            }
        }