/// <summary>
 /// Inserts the given saga data instance into the index file
 /// </summary>
 public async Task Insert(ISagaData sagaData, IEnumerable <ISagaCorrelationProperty> correlationProperties)
 {
     using (new FileSystemExclusiveLock(_lockFile, _log))
     {
         var index = new FileSystemSagaIndex(_basePath);
         var id    = GetId(sagaData);
         if (sagaData.Revision != 0)
         {
             throw new InvalidOperationException($"Attempted to insert saga data with ID {id} and revision {sagaData.Revision}, but revision must be 0 on first insert!");
         }
         var existingSaga = index.FindById(id);
         if (existingSaga != null)
         {
             throw new ConcurrencyException($"Saga data with ID {id} already exists!");
         }
         index.Insert(sagaData, correlationProperties);
     }
 }
 /// <summary>
 /// Updates the given saga data instance in the index file
 /// </summary>
 public async Task Update(ISagaData sagaData, IEnumerable <ISagaCorrelationProperty> correlationProperties)
 {
     using (new FileSystemExclusiveLock(_lockFile, _log))
     {
         var index        = new FileSystemSagaIndex(_basePath);
         var id           = GetId(sagaData);
         var existingCopy = index.FindById(id);
         if (existingCopy == null)
         {
             throw new ConcurrencyException($"Saga data with ID {id} does not exist!");
         }
         if (existingCopy.Revision != sagaData.Revision)
         {
             throw new ConcurrencyException($"Attempted to update saga data with ID {id} with revision {sagaData.Revision}, but the existing data was updated to revision {existingCopy.Revision}");
         }
         sagaData.Revision++;
         index.Insert(sagaData, correlationProperties);
     }
 }
    /// <summary>
    /// Looks up an existing saga data instance from the index file
    /// </summary>
    public async Task <ISagaData> Find(Type sagaDataType, string propertyName, object propertyValue)
    {
        using (new FileSystemExclusiveLock(_lockFile, _log))
        {
            var index = new FileSystemSagaIndex(_basePath);
            if (propertyName == IdPropertyName)
            {
                var sagaData = index.FindById((Guid)propertyValue);

                if (!sagaDataType.IsInstanceOfType(sagaData))
                {
                    return(null);
                }

                return(sagaData);
            }
            return(index.Find(sagaDataType, propertyName, propertyValue));
        }
    }