Skip to content

Commit

Permalink
Don't pass around JourneyName when we've got an InstanceId
Browse files Browse the repository at this point in the history
  • Loading branch information
gunndabad committed Oct 5, 2023
1 parent d7a9492 commit fad72f1
Show file tree
Hide file tree
Showing 9 changed files with 43 additions and 93 deletions.
15 changes: 5 additions & 10 deletions src/FormFlow/JourneyInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,13 @@ public class JourneyInstance

internal JourneyInstance(
IUserInstanceStateProvider stateProvider,
string journeyName,
JourneyInstanceId instanceId,
Type stateType,
object state,
IReadOnlyDictionary<object, object> properties,
bool completed = false)
{
_stateProvider = stateProvider ?? throw new ArgumentNullException(nameof(stateProvider));
JourneyName = journeyName ?? throw new ArgumentNullException(nameof(journeyName));
StateType = stateType ?? throw new ArgumentNullException(nameof(stateType));
InstanceId = instanceId;
Properties = properties ?? PropertiesBuilder.CreateEmpty();
Expand All @@ -31,7 +29,7 @@ internal JourneyInstance(

public bool Deleted { get; internal set; }

public string JourneyName { get; }
public string JourneyName => InstanceId.JourneyName;

public JourneyInstanceId InstanceId { get; }

Expand All @@ -43,7 +41,6 @@ internal JourneyInstance(

public static JourneyInstance Create(
IUserInstanceStateProvider stateProvider,
string journeyName,
JourneyInstanceId instanceId,
Type stateType,
object state,
Expand All @@ -55,7 +52,6 @@ public static JourneyInstance Create(
return (JourneyInstance)Activator.CreateInstance(
genericType,
stateProvider,
journeyName,
instanceId,
state,
properties,
Expand All @@ -74,7 +70,7 @@ public async Task CompleteAsync()
throw new InvalidOperationException("Instance has been deleted.");
}

await _stateProvider.CompleteInstanceAsync(JourneyName, InstanceId, StateType);
await _stateProvider.CompleteInstanceAsync(InstanceId, StateType);
Completed = true;
}

Expand All @@ -85,7 +81,7 @@ public async Task DeleteAsync()
return;
}

await _stateProvider.DeleteInstanceAsync(JourneyName, InstanceId, StateType);
await _stateProvider.DeleteInstanceAsync(InstanceId, StateType);
Deleted = true;
}

Expand Down Expand Up @@ -122,7 +118,7 @@ protected async Task UpdateStateAsync(object state)
throw new InvalidOperationException("Instance has been deleted.");
}

await _stateProvider.UpdateInstanceStateAsync(JourneyName, InstanceId, StateType, state);
await _stateProvider.UpdateInstanceStateAsync(InstanceId, StateType, state);
State = state;
}
}
Expand All @@ -131,12 +127,11 @@ public sealed class JourneyInstance<TState> : JourneyInstance
{
public JourneyInstance(
IUserInstanceStateProvider stateProvider,
string journeyName,
JourneyInstanceId instanceId,
TState state,
IReadOnlyDictionary<object, object> properties,
bool completed = false)
: base(stateProvider, journeyName, instanceId, typeof(TState), state!, properties, completed)
: base(stateProvider, instanceId, typeof(TState), state!, properties, completed)
{
}

Expand Down
8 changes: 3 additions & 5 deletions src/FormFlow/JourneyInstanceProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,12 @@ public async Task<JourneyInstance> CreateInstanceAsync(
journeyDescriptor,
valueProvider);

if (await _stateProvider.GetInstanceAsync(journeyDescriptor.JourneyName, instanceId, journeyDescriptor.StateType) != null)
if (await _stateProvider.GetInstanceAsync(instanceId, journeyDescriptor.StateType) != null)
{
throw new InvalidOperationException("Instance already exists with this ID.");
}

return await _stateProvider.CreateInstanceAsync(
journeyDescriptor.JourneyName,
instanceId,
journeyDescriptor.StateType,
state,
Expand All @@ -73,13 +72,12 @@ public async Task<JourneyInstance<TState>> CreateInstanceAsync<TState>(
journeyDescriptor,
valueProvider);

if (await _stateProvider.GetInstanceAsync(journeyDescriptor.JourneyName, instanceId, journeyDescriptor.StateType) != null)
if (await _stateProvider.GetInstanceAsync(instanceId, journeyDescriptor.StateType) != null)
{
throw new InvalidOperationException("Instance already exists with this ID.");
}

return (JourneyInstance<TState>)await _stateProvider.CreateInstanceAsync(
journeyDescriptor.JourneyName,
instanceId,
journeyDescriptor.StateType,
state,
Expand Down Expand Up @@ -286,7 +284,7 @@ public bool IsCurrentInstance(ActionContext actionContext, JourneyInstanceId ins
return null;
}

var persistedInstance = await _stateProvider.GetInstanceAsync(journeyDescriptor.JourneyName, instanceId.Value, journeyDescriptor.StateType);
var persistedInstance = await _stateProvider.GetInstanceAsync(instanceId.Value, journeyDescriptor.StateType);
if (persistedInstance == null)
{
return null;
Expand Down
9 changes: 4 additions & 5 deletions src/FormFlow/State/IUserInstanceStateProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,17 @@ namespace FormFlow.State;

public interface IUserInstanceStateProvider
{
Task CompleteInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType);
Task CompleteInstanceAsync(JourneyInstanceId instanceId, Type stateType);

Task<JourneyInstance> CreateInstanceAsync(
string journeyName,
JourneyInstanceId instanceId,
Type stateType,
object state,
IReadOnlyDictionary<object, object>? properties);

Task DeleteInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType);
Task DeleteInstanceAsync(JourneyInstanceId instanceId, Type stateType);

Task<JourneyInstance?> GetInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType);
Task<JourneyInstance?> GetInstanceAsync(JourneyInstanceId instanceId, Type stateType);

Task UpdateInstanceStateAsync(string journeyName, JourneyInstanceId instanceId, Type stateType, object state);
Task UpdateInstanceStateAsync(JourneyInstanceId instanceId, Type stateType, object state);
}
18 changes: 5 additions & 13 deletions src/FormFlow/State/SessionUserInstanceStateProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,11 @@ public SessionUserInstanceStateProvider(
}

public Task<JourneyInstance> CreateInstanceAsync(
string journeyName,
JourneyInstanceId instanceId,
Type stateType,
object state,
IReadOnlyDictionary<object, object>? properties)
{
ArgumentNullException.ThrowIfNull(journeyName);
ArgumentNullException.ThrowIfNull(stateType);
ArgumentNullException.ThrowIfNull(state);

Expand All @@ -39,20 +37,18 @@ public Task<JourneyInstance> CreateInstanceAsync(

var entry = new SessionEntry()
{
JourneyName = journeyName,
State = serializedState,
Properties = properties,
Completed = false
};

SetSessionEntry(instanceId, entry);

return Task.FromResult(JourneyInstance.Create(this, journeyName, instanceId, stateType, state, properties));
return Task.FromResult(JourneyInstance.Create(this, instanceId, stateType, state, properties));
}

public Task CompleteInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType)
public Task CompleteInstanceAsync(JourneyInstanceId instanceId, Type stateType)
{
ArgumentNullException.ThrowIfNull(journeyName);
ArgumentNullException.ThrowIfNull(stateType);

var session = GetSession();
Expand All @@ -72,9 +68,8 @@ public Task CompleteInstanceAsync(string journeyName, JourneyInstanceId instance
return Task.CompletedTask;
}

public Task DeleteInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType)
public Task DeleteInstanceAsync(JourneyInstanceId instanceId, Type stateType)
{
ArgumentNullException.ThrowIfNull(journeyName);
ArgumentNullException.ThrowIfNull(stateType);

var session = GetSession();
Expand All @@ -92,9 +87,8 @@ public Task DeleteInstanceAsync(string journeyName, JourneyInstanceId instanceId
return Task.CompletedTask;
}

public Task<JourneyInstance?> GetInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType)
public Task<JourneyInstance?> GetInstanceAsync(JourneyInstanceId instanceId, Type stateType)
{
ArgumentNullException.ThrowIfNull(journeyName);
ArgumentNullException.ThrowIfNull(stateType);

var session = GetSession();
Expand All @@ -107,7 +101,6 @@ public Task DeleteInstanceAsync(string journeyName, JourneyInstanceId instanceId

return Task.FromResult((JourneyInstance?)JourneyInstance.Create(
this,
entry.JourneyName,
instanceId,
stateType,
deserializedState,
Expand All @@ -120,7 +113,7 @@ public Task DeleteInstanceAsync(string journeyName, JourneyInstanceId instanceId
}
}

public Task UpdateInstanceStateAsync(string journeyName, JourneyInstanceId instanceId, Type stateType, object state)
public Task UpdateInstanceStateAsync(JourneyInstanceId instanceId, Type stateType, object state)
{
var session = GetSession();
var storeKey = GetKeyForInstance(instanceId);
Expand Down Expand Up @@ -167,7 +160,6 @@ private static string GetKeyForInstance(string instanceId) =>

private class SessionEntry
{
public string JourneyName { get; set; } = null!;
public string State { get; set; } = null!;
public IReadOnlyDictionary<object, object> Properties { get; set; } = null!;
public bool Completed { get; set; }
Expand Down
5 changes: 0 additions & 5 deletions test/FormFlow.Tests/EndToEndTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ public async Task ReadState_ReturnsStateAndProperties()
{
// Arrange
var instance = await StateProvider.CreateInstanceAsync(
journeyName: "E2ETests",
instanceId: GenerateInstanceId(out var id, out var subid),
stateType: typeof(E2ETestsState),
state: E2ETestsState.CreateInitialState(),
Expand All @@ -41,7 +40,6 @@ public async Task UpdateState_UpdatesStateAndRedirects()
{
// Arrange
var instance = await StateProvider.CreateInstanceAsync(
journeyName: "E2ETests",
instanceId: GenerateInstanceId(out var id, out var subid),
stateType: typeof(E2ETestsState),
state: E2ETestsState.CreateInitialState(),
Expand All @@ -56,7 +54,6 @@ public async Task Complete_DoesNotAllowStateToBeUpdatedSubsequently()
{
// Arrange
var instance = await StateProvider.CreateInstanceAsync(
journeyName: "E2ETests",
instanceId: GenerateInstanceId(out var id, out var subid),
stateType: typeof(E2ETestsState),
state: E2ETestsState.CreateInitialState(),
Expand All @@ -82,7 +79,6 @@ public async Task Complete_DoesAllowStateToBeReadSubsequently()
{
// Arrange
var instance = await StateProvider.CreateInstanceAsync(
journeyName: "E2ETests",
instanceId: GenerateInstanceId(out var id, out var subid),
stateType: typeof(E2ETestsState),
state: E2ETestsState.CreateInitialState(),
Expand All @@ -108,7 +104,6 @@ public async Task Delete_ReturnsOk()
{
// Arrange
var instance = await StateProvider.CreateInstanceAsync(
journeyName: "E2ETests",
instanceId: GenerateInstanceId(out var id, out var subid),
stateType: typeof(E2ETestsState),
state: E2ETestsState.CreateInitialState(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,26 @@ public class InMemoryInstanceStateProvider : IUserInstanceStateProvider

public InMemoryInstanceStateProvider()
{
_instances = new Dictionary<string, Entry>();
_instances = new();
}

public void Clear() => _instances.Clear();

public Task<JourneyInstance> CreateInstanceAsync(
string journeyName,
JourneyInstanceId instanceId,
Type stateType,
object state,
IReadOnlyDictionary<object, object>? properties)
{
_instances.Add(instanceId, new Entry()
{
JourneyName = journeyName,
StateType = stateType,
State = state,
Properties = properties
});

var instance = JourneyInstance.Create(
this,
journeyName,
instanceId,
stateType,
state,
Expand All @@ -42,38 +39,37 @@ public Task<JourneyInstance> CreateInstanceAsync(
return Task.FromResult(instance);
}

public Task CompleteInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType)
public Task CompleteInstanceAsync(JourneyInstanceId instanceId, Type stateType)
{
_instances[instanceId].Completed = true;
return Task.CompletedTask;
}

public Task DeleteInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType)
public Task DeleteInstanceAsync(JourneyInstanceId instanceId, Type stateType)
{
_instances.Remove(instanceId);
return Task.CompletedTask;
}

public Task<JourneyInstance?> GetInstanceAsync(string journeyName, JourneyInstanceId instanceId, Type stateType)
public Task<JourneyInstance?> GetInstanceAsync(JourneyInstanceId instanceId, Type stateType)
{
_instances.TryGetValue(instanceId, out var entry);

var instance = entry != null ?
JourneyInstance.Create(this, entry.JourneyName!, instanceId, entry.StateType!, entry.State!, entry.Properties!, entry.Completed) :
JourneyInstance.Create(this, instanceId, entry.StateType!, entry.State!, entry.Properties!, entry.Completed) :
null;

return Task.FromResult(instance);
}

public Task UpdateInstanceStateAsync(string journeyName, JourneyInstanceId instanceId, Type stateType, object state)
public Task UpdateInstanceStateAsync(JourneyInstanceId instanceId, Type stateType, object state)
{
_instances[instanceId].State = state;
return Task.CompletedTask;
}

private class Entry
{
public string? JourneyName { get; set; }
public IReadOnlyDictionary<object, object>? Properties { get; set; }
public object? State { get; set; }
public Type? StateType { get; set; }
Expand Down
1 change: 0 additions & 1 deletion test/FormFlow.Tests/Infrastructure/MvcTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ protected async Task<JourneyInstance<TState>> CreateInstanceAsync<TState>(
var instanceStateProvider = Fixture.Services.GetRequiredService<IUserInstanceStateProvider>();

return (JourneyInstance<TState>)await instanceStateProvider.CreateInstanceAsync(
journeyName,
instanceId,
typeof(TState),
state,
Expand Down
Loading

0 comments on commit fad72f1

Please sign in to comment.