Skip to content

Commit

Permalink
feat: Add Simpler Event Creation (#15)
Browse files Browse the repository at this point in the history
  • Loading branch information
no1melman authored Dec 23, 2021
1 parent 633209e commit 8539202
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 4 deletions.
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ let opts =
opts
let eventData = Helpers.createJsonEvent opts "UserAdded" {| UserName = "Callum" |}
let moreEventData = createJsonEventFromObj opts data // this will use the Type Name of data, so data.GetType().Name
```

Publishing events:
Expand Down Expand Up @@ -188,3 +189,25 @@ type StreamSubscriber(logger: ILogger<StreamSubscriber>, eventStoreFactory: IEve
override this.StoreLatestEventPosition latestEventPosition = Task.CompletedTask // this is for if you want to store the last position in Redis or something
override this.Stream = "Test Stream" // this will be the stream you're subscribing to...
```

#### Json

There is some helpers for the json stuff

```fsharp
let opts = Json.Common.jsonOpts None [] // creates JsonSerializerOptions with only the defaults (includes OptionsConverterFactory) (no extra converters)
let opts2 = Json.Common.jsonOpts (Some opts) [] // creates JsonSerializerOptions with the previous as the base (no converters)
let opts3 = Json.Common.jsonOpts None [ MyCustomConverter() ] // creates JsonSerializerOptions with a `MyCustomConverter` included (only defaults)
```

If you want to use the `OptionConverter<Option<'a>>` (which isn't needed if using the above) then you do

```fsharp
let opts =
let opts = JsonSerializerOptions()
opts.Converters.Add(OptionConverterFactory())
opts
```
11 changes: 8 additions & 3 deletions src/Common/Helpers.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,28 @@ module Melman.EventStore.Common.Helpers
open System
open System.Text.Json

open System.Threading
open EventStore.Client


let createClient url = new EventStoreClient(EventStoreClientSettings.Create(url))

let private deserialiseWithReturnType opts eventType (data: ReadOnlyMemory<byte>) = JsonSerializer.Deserialize(data.Span, returnType = eventType, options = opts)
let private deserialise<'a> opts (data: ReadOnlyMemory<byte>) = JsonSerializer.Deserialize<'a>(data.Span, options = opts)
let private serialise opts data = ReadOnlyMemory(JsonSerializer.SerializeToUtf8Bytes(data, options = opts))

let private getEventType<'a> = typedefof<'a>.Name
let private getEventTypeFromObject data = data.GetType().Name

let createJsonEvent (options: JsonSerializerOptions) eventType data =
let serialisedData = serialise options data
EventData(
Uuid.NewUuid(),
eventType,
serialisedData)


let createJsonEventFromObj (options: JsonSerializerOptions) data =
createJsonEvent options (getEventTypeFromObject data) data


let appendEvents (client: EventStoreClient) cancellationToken streamName events = task {
let! writeResult = client.AppendToStreamAsync(streamName, StreamState.Any, events, cancellationToken = cancellationToken)

Expand Down
2 changes: 1 addition & 1 deletion src/Common/Melman.EventStore.Common.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<TargetFramework>net6.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageId>Melman.EventStore.Common</PackageId>
<Version>0.0.11</Version>
<Version>0.0.12</Version>
<Authors>Callum Linington</Authors>
<PackageTags>EventStore;Melman;Common;EventStoreDb;Fsharp;FSharp</PackageTags>
<Description>
Expand Down
17 changes: 17 additions & 0 deletions tests/Common/HelpersTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,21 @@ let ``Given the system type for an event it still deserilises`` () =

let result = readEventWithType opts resEv (typedefof<TempData>) :?> TempData

Assert.That("jeff" = result.Name)


[<Test>]
let ``Given the just data it creates event`` () =
let opts =
let opts = JsonSerializerOptions()
opts.PropertyNameCaseInsensitive <- true
opts

let data = createJsonEventFromObj opts { Name = "jeff" }

let resEv = createDummyRecord data

let result = readEventWithType opts resEv (typedefof<TempData>) :?> TempData

Assert.AreEqual("TempData", data.Type)
Assert.That("jeff" = result.Name)

0 comments on commit 8539202

Please sign in to comment.