using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using BTCPayServer.Client.Models; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using NBitcoin; namespace BTCPayServer.Data { public partial class PayoutData { [Key] [MaxLength(30)] public string Id { get; set; } public DateTimeOffset Date { get; set; } public string PullPaymentDataId { get; set; } public string StoreDataId { get; set; } /// /// The currency of the payout (eg. BTC) /// public string Currency { get; set; } /// /// The amount of the payout in Currency. /// The Amount only get set when the payout is actually approved. /// public decimal? Amount { get; set; } /// /// The original currency of the payout (eg. USD) /// public string OriginalCurrency { get; set; } /// /// The amount of the payout in OriginalCurrency /// public decimal OriginalAmount { get; set; } public PullPaymentData PullPaymentData { get; set; } [MaxLength(20)] public PayoutState State { get; set; } [MaxLength(20)] [Required] public string PayoutMethodId { get; set; } public string Blob { get; set; } public string Proof { get; set; } #nullable enable /// /// For example, BTC-CHAIN needs to ensure that only a single address is tied to an active payout. /// If `PayoutBlob.Destination` is `bitcoin://1BvBMSeYstWetqTFn5Au4m4GFg7xJaNVN2?amount=0.1` /// Then `DedupId` is `1BvBMSeYstWetqTFn5Au4m4GFg7xJaNVN2` /// For Lightning, Destination could be the lightning address, BOLT11 or LNURL /// But the `DedupId` would be the `PaymentHash`. /// public string? DedupId { get; set; } #nullable restore public StoreData StoreData { get; set; } internal static void OnModelCreating(ModelBuilder builder, DatabaseFacade databaseFacade) { builder.Entity() .HasOne(o => o.PullPaymentData) .WithMany(o => o.Payouts).OnDelete(DeleteBehavior.Cascade); builder.Entity() .HasOne(o => o.StoreData) .WithMany(o => o.Payouts).OnDelete(DeleteBehavior.Cascade); builder.Entity() .Property(o => o.State) .HasConversion(); builder.Entity() .HasIndex(o => o.State); builder.Entity() .HasIndex(x => new { DestinationId = x.DedupId, x.State }); builder.Entity() .Property(o => o.Blob) .HasColumnType("jsonb"); builder.Entity() .Property(o => o.Proof) .HasColumnType("JSONB"); } } }