diff --git a/src/Core/DaprPubSubComponents.cs b/src/Core/DaprPubSubComponents.cs new file mode 100644 index 0000000..96cf9be --- /dev/null +++ b/src/Core/DaprPubSubComponents.cs @@ -0,0 +1,5 @@ +namespace Core; + +public static class DaprPubSubComponents { + public const string PubSub = "pubsub"; +} diff --git a/src/Core/DaprPubSubTopics.cs b/src/Core/DaprPubSubTopics.cs new file mode 100644 index 0000000..03d1724 --- /dev/null +++ b/src/Core/DaprPubSubTopics.cs @@ -0,0 +1,5 @@ +namespace Core; + +public static class DaprPubSubTopics { + public const string Test = "test"; +} \ No newline at end of file diff --git a/src/Core/DaprShardStateStoreKeys.cs b/src/Core/DaprShardStateStoreKeys.cs new file mode 100644 index 0000000..fff730b --- /dev/null +++ b/src/Core/DaprShardStateStoreKeys.cs @@ -0,0 +1,5 @@ +namespace Core; + +public static class DaprShardStateStoreKeys { + public const string Test = "test"; +} diff --git a/src/Core/DaprStateStoreComponents.cs b/src/Core/DaprStateStoreComponents.cs new file mode 100644 index 0000000..fbd3ada --- /dev/null +++ b/src/Core/DaprStateStoreComponents.cs @@ -0,0 +1,7 @@ +namespace Core; + +public static class DaprStateStoreComponents { + public const string SharedStore = "statestore"; + public const string PrivateStore = "privatestore"; + public const string ActorsStore = "actorsstore"; +} diff --git a/src/Core/StateEntities/TestStateEntity.cs b/src/Core/StateEntities/TestStateEntity.cs new file mode 100644 index 0000000..7c6697c --- /dev/null +++ b/src/Core/StateEntities/TestStateEntity.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Core.StateEntities; +public class TestStateEntity { + public string Message { get; set; } +} diff --git a/src/Publisher/Controllers/DaprTestController.cs b/src/Publisher/Controllers/DaprTestController.cs index f0fa6b8..5368094 100644 --- a/src/Publisher/Controllers/DaprTestController.cs +++ b/src/Publisher/Controllers/DaprTestController.cs @@ -1,9 +1,10 @@ +using Core; using Core.Commands; +using Core.StateEntities; using MaksIT.Core.Dapr; using MaksIT.Core.Extensions; using Microsoft.AspNetCore.Mvc; using Publisher.Models; -using System.Text.Json; namespace Publisher.Controllers; [ApiController] @@ -11,24 +12,45 @@ namespace Publisher.Controllers; public class DaprTestController : ControllerBase { private readonly ILogger _logger; - private readonly IDaprService _daprService; + private readonly IDaprPublisherService _daprPublisherService; + private readonly IDaprStateStoreService _daprStateStoreService; public DaprTestController( ILogger logger, - IDaprService daprService + IDaprPublisherService daprPublisherService, + IDaprStateStoreService daprStateStoreService ) { _logger = logger; - _daprService = daprService; + _daprPublisherService = daprPublisherService; + _daprStateStoreService = daprStateStoreService; } [HttpPost(Name = "DaprTestPublisher")] public async Task Post([FromBody] PostDaprTestRequest requestData) { - var result = await _daprService.PublishEventAsync( - "pubsub", - "test", + + var setStateResult = await _daprStateStoreService.SetStateAsync(DaprStateStoreComponents.SharedStore, DaprShardStateStoreKeys.Test, new TestStateEntity { + Message = requestData.Message + }); + + if (!setStateResult.IsSuccess) + return setStateResult.ToActionResult(); + + var gerStateResult = await _daprStateStoreService.GetStateAsync(DaprStateStoreComponents.SharedStore, DaprShardStateStoreKeys.Test); + if (!gerStateResult.IsSuccess || gerStateResult.Value == null) { + return gerStateResult.ToActionResult(); + } + + var state = gerStateResult.Value; + + _logger.LogInformation($"Shared state message: {state.Message}"); + + var result = await _daprPublisherService.PublishEventAsync( + DaprPubSubComponents.PubSub, + DaprPubSubTopics.Test, new TestCommand { Message = requestData.Message }.ToJson()); + return result.ToActionResult(); } } diff --git a/src/Publisher/Program.cs b/src/Publisher/Program.cs index d7cd91c..68a2813 100644 --- a/src/Publisher/Program.cs +++ b/src/Publisher/Program.cs @@ -10,6 +10,7 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.RegisterPublisher(); +builder.Services.RegisterStateStore(); var app = builder.Build(); diff --git a/src/Publisher/Publisher.csproj b/src/Publisher/Publisher.csproj index 1b7be98..0e3fb15 100644 --- a/src/Publisher/Publisher.csproj +++ b/src/Publisher/Publisher.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/Subscriber/Controllers/DaprTestController.cs b/src/Subscriber/Controllers/DaprTestController.cs index 69710b6..8b49510 100644 --- a/src/Subscriber/Controllers/DaprTestController.cs +++ b/src/Subscriber/Controllers/DaprTestController.cs @@ -1,5 +1,8 @@ +using Core; using Core.Commands; +using Core.StateEntities; using Dapr; +using MaksIT.Core.Dapr; using MaksIT.Core.Extensions; using Microsoft.AspNetCore.Mvc; @@ -9,22 +12,38 @@ namespace Subscriber.Controllers; public class DaprTestController : ControllerBase { private readonly ILogger _logger; + private readonly IDaprStateStoreService _daprStateStoreService; public DaprTestController( - ILogger logger + ILogger logger, + IDaprStateStoreService daprStateStoreService ) { _logger = logger; + _daprStateStoreService = daprStateStoreService; } - [Topic("pubsub", "test")] + [Topic(DaprPubSubComponents.PubSub, DaprPubSubTopics.Test)] [HttpPost(Name = "DaprTestSubscriber")] - public IActionResult Post([FromBody] string json) { + public async Task Post([FromBody] string json) { var requestData = json.ToObject(); if (requestData == null) return BadRequest(); - _logger.LogInformation("Received message: {0}", requestData.Message); + _logger.LogInformation($"Pubsub command message: {requestData.Message}"); + + var getStateResult = await _daprStateStoreService.GetStateAsync(DaprStateStoreComponents.SharedStore, DaprShardStateStoreKeys.Test); + if (!getStateResult.IsSuccess || getStateResult.Value == null) { + return getStateResult.ToActionResult(); + } + + var state = getStateResult.Value; + _logger.LogInformation($"Shared state message: {state.Message}"); + + var deleteStateResult = await _daprStateStoreService.DeleteStateAsync(DaprStateStoreComponents.SharedStore, DaprShardStateStoreKeys.Test); + if (!deleteStateResult.IsSuccess) + return deleteStateResult.ToActionResult(); + return Ok(); } } diff --git a/src/Subscriber/Program.cs b/src/Subscriber/Program.cs index 3cf4590..e780945 100644 --- a/src/Subscriber/Program.cs +++ b/src/Subscriber/Program.cs @@ -8,6 +8,8 @@ builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); +builder.Services.RegisterStateStore(); + var app = builder.Build(); // Configure the HTTP request pipeline. diff --git a/src/Subscriber/Subscriber.csproj b/src/Subscriber/Subscriber.csproj index fe06490..c46e033 100644 --- a/src/Subscriber/Subscriber.csproj +++ b/src/Subscriber/Subscriber.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/docker-compose.override.yml b/src/docker-compose.override.yml index 11d5bda..7c45e65 100644 --- a/src/docker-compose.override.yml +++ b/src/docker-compose.override.yml @@ -26,6 +26,9 @@ services: ] depends_on: - placement + - rabbitmq + - redis + - zipkin - publisher network_mode: "service:publisher" # Attach the publisher-dapr service to the publisher network namespace @@ -53,6 +56,9 @@ services: ] depends_on: - placement + - rabbitmq + - redis + - zipkin - subscriber network_mode: "service:subscriber" # Attach the subscriber-dapr service to the subscriber network namespace @@ -103,6 +109,6 @@ services: redis: ports: - - "6380:6379" + - "6379:6379" networks: - hello-dapr \ No newline at end of file diff --git a/src/docker-compose/dapr/components/statestore.yaml b/src/docker-compose/dapr/components/statestore.yaml index 1a26897..b88f71d 100644 --- a/src/docker-compose/dapr/components/statestore.yaml +++ b/src/docker-compose/dapr/components/statestore.yaml @@ -3,6 +3,36 @@ kind: Component metadata: name: statestore namespace: dapr-test +spec: + type: state.redis + version: v1 + metadata: + - name: redisHost + value: redis:6379 + - name: keyPrefix + value: none # Disables prefixing + +--- + +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: privatestatestore + namespace: dapr-test +spec: + type: state.redis + version: v1 + metadata: + - name: redisHost + value: redis:6379 + +--- + +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: actorsstatestore + namespace: dapr-test spec: type: state.redis version: v1