using Pushy.Domain; namespace Pushy.Silo.Grains; public sealed class TextItemGrain : IGrainBase, ITextItem, IRemindable { private readonly IPersistentState _state; private readonly ILogger _logger; private IGrainReminder? _reminder; public TextItemGrain( IGrainContext grainContext, [PersistentState("text")] IPersistentState state, ILogger logger) { _state = state; _logger = logger; GrainContext = grainContext; } public IGrainContext GrainContext { get; } /// public async Task OnActivateAsync(CancellationToken cancellationToken) { _reminder = await this.RegisterOrUpdateReminder("clear", TimeSpan.FromDays(10), TimeSpan.FromDays(10)); } /// public async ValueTask SetText(string text) { try { if (_state.State.Text is not null) return TextSetResult.Failure; _state.State.Text = text; await _state.WriteStateAsync(); return TextSetResult.Success; } catch (Exception) { return TextSetResult.Failure; } } /// public ValueTask GetText() { return ValueTask.FromResult(_state.State.Text ?? throw new InvalidOperationException("No text was available")); } /// public async Task ReceiveReminder(string reminderName, TickStatus status) { if (reminderName == "clear") { _state.State.Text = null; await _state.WriteStateAsync(); this.DeactivateOnIdle(); _logger.LogInformation("Text item have been cleared!"); } } }