Replace polling with push-based Telegram notification queue
Deploy Staging / deploy (push) Successful in 1m11s

This commit is contained in:
Francesco Lorenzo D'Amico
2026-08-24 14:41:56 +02:00
parent e66d95ec7a
commit 51522e1f3f
4 changed files with 116 additions and 36 deletions
@@ -0,0 +1,32 @@
using System.Collections.Concurrent;
using System.Threading.Channels;
namespace RazorPagesMovie.Services;
public interface IContactMessageNotificationQueue
{
void Enqueue(Guid contactMessageId);
IAsyncEnumerable<Guid> DequeueAllAsync(CancellationToken cancellationToken);
void Release(Guid contactMessageId);
}
public class ContactMessageNotificationQueue : IContactMessageNotificationQueue
{
private readonly Channel<Guid> _channel = Channel.CreateUnbounded<Guid>();
private readonly ConcurrentDictionary<Guid, byte> _inFlight = new();
public void Enqueue(Guid contactMessageId)
{
if (_inFlight.TryAdd(contactMessageId, 0))
{
_channel.Writer.TryWrite(contactMessageId);
}
}
public IAsyncEnumerable<Guid> DequeueAllAsync(CancellationToken cancellationToken) =>
_channel.Reader.ReadAllAsync(cancellationToken);
public void Release(Guid contactMessageId) => _inFlight.TryRemove(contactMessageId, out _);
}