using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json; using System.Text.Json.Serialization; using DysonNetwork.Sphere.Chat.Realtime; using NodaTime; namespace DysonNetwork.Sphere.Chat; public class RealtimeCall : ModelBase { public Guid Id { get; set; } = Guid.NewGuid(); public Instant? EndedAt { get; set; } public Guid SenderId { get; set; } public ChatMember Sender { get; set; } = null!; public Guid RoomId { get; set; } public ChatRoom Room { get; set; } = null!; /// /// Provider name (e.g., "cloudflare", "agora", "twilio") /// public string? ProviderName { get; set; } /// /// Service provider's session identifier /// public string? SessionId { get; set; } /// /// JSONB column containing provider-specific configuration /// [Column(name: "upstream", TypeName = "jsonb")] public string? UpstreamConfigJson { get; set; } /// /// Deserialized upstream configuration /// [NotMapped] public Dictionary UpstreamConfig { get => string.IsNullOrEmpty(UpstreamConfigJson) ? new Dictionary() : JsonSerializer.Deserialize>(UpstreamConfigJson) ?? new Dictionary(); set => UpstreamConfigJson = value.Count > 0 ? JsonSerializer.Serialize(value) : null; } }