feat(fundamentals): refactor entities, add Yahoo modules scraper, 52W metrics and migrations
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using FinlyticCore.Entities.Settings;
|
||||
using FinlyticFundamentals.Entities;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
@@ -9,74 +10,84 @@ public class FundamentalsDbContext : DbContext
|
||||
{
|
||||
}
|
||||
|
||||
public DbSet<AssetFundamentalsEntity> AssetFundamentals => Set<AssetFundamentalsEntity>();
|
||||
public DbSet<CompanyExecutiveEntity> CompanyExecutives => Set<CompanyExecutiveEntity>();
|
||||
public DbSet<FinancialStatementEntity> FinancialStatements => Set<FinancialStatementEntity>();
|
||||
public DbSet<ForwardEstimateEntity> ForwardEstimates => Set<ForwardEstimateEntity>();
|
||||
public DbSet<TickerFundamentalsEntity> TickerFundamentals => Set<TickerFundamentalsEntity>();
|
||||
public DbSet<FundamentalsSettingsEntity> Settings => Set<FundamentalsSettingsEntity>();
|
||||
public DbSet<SettingEntity> DynamicSettings => Set<SettingEntity>();
|
||||
public DbSet<AssetDataEntity> AssetData => Set<AssetDataEntity>();
|
||||
public DbSet<FundamentalDataEntity> FundamentalData => Set<FundamentalDataEntity>();
|
||||
public DbSet<KeyExecutiveEntity> KeyExecutives => Set<KeyExecutiveEntity>();
|
||||
public DbSet<AssetEventEntity> AssetEvents => Set<AssetEventEntity>();
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
base.OnModelCreating(modelBuilder);
|
||||
|
||||
// AssetFundamentals Configurations
|
||||
modelBuilder.Entity<AssetFundamentalsEntity>(entity =>
|
||||
modelBuilder.Entity<SettingEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Id);
|
||||
entity.HasIndex(e => e.Key);
|
||||
});
|
||||
|
||||
modelBuilder.Entity<AssetDataEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Isin);
|
||||
entity.HasIndex(e => e.PrimaryTicker).IsUnique();
|
||||
|
||||
// Setup One-to-Many Relationships with cascades
|
||||
entity.HasMany(e => e.Executives)
|
||||
.WithOne(e => e.AssetFundamentals)
|
||||
.HasForeignKey(e => e.Isin)
|
||||
entity.OwnsOne(e => e.PrimaryTicker, t =>
|
||||
{
|
||||
t.Property(p => p.Ticker).HasColumnName("PrimaryTicker").HasDefaultValue(string.Empty);
|
||||
t.Property(p => p.Exchange).HasColumnName("PrimaryTickerExchange").HasDefaultValue(string.Empty);
|
||||
});
|
||||
|
||||
entity.OwnsMany(e => e.AvailableTickers, t =>
|
||||
{
|
||||
t.ToTable("Tickers");
|
||||
t.WithOwner().HasForeignKey("AssetDataIsin");
|
||||
t.Property<Guid>("Id");
|
||||
t.HasKey("Id");
|
||||
t.Property(p => p.Ticker).HasColumnName("Ticker");
|
||||
t.Property(p => p.Exchange).HasColumnName("Exchange");
|
||||
t.HasIndex(p => p.Ticker);
|
||||
});
|
||||
|
||||
entity.HasMany(e => e.FundamentalData)
|
||||
.WithOne(e => e.AssetData)
|
||||
.HasForeignKey(e => e.AssetDataIsin)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
|
||||
entity.HasMany(e => e.FinancialStatements)
|
||||
.WithOne(e => e.AssetFundamentals)
|
||||
.HasForeignKey(e => e.Isin)
|
||||
entity.HasMany(e => e.KeyExecutives)
|
||||
.WithOne(e => e.AssetData)
|
||||
.HasForeignKey(e => e.AssetDataIsin)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
|
||||
entity.HasMany(e => e.Estimates)
|
||||
.WithOne(e => e.AssetFundamentals)
|
||||
.HasForeignKey(e => e.Isin)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
|
||||
entity.HasMany(e => e.TickerFundamentals)
|
||||
.WithOne(e => e.AssetFundamentals)
|
||||
.HasForeignKey(e => e.Isin)
|
||||
entity.HasMany(e => e.AssetEvents)
|
||||
.WithOne(e => e.AssetData)
|
||||
.HasForeignKey(e => e.AssetDataIsin)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
});
|
||||
|
||||
// CompanyExecutive Configurations
|
||||
modelBuilder.Entity<CompanyExecutiveEntity>(entity =>
|
||||
modelBuilder.Entity<FundamentalDataEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Isin);
|
||||
|
||||
entity.OwnsOne(e => e.Ticker, t =>
|
||||
{
|
||||
t.Property(p => p.Ticker).HasColumnName("Ticker").HasDefaultValue(string.Empty);
|
||||
t.Property(p => p.Exchange).HasColumnName("TickerExchange").HasDefaultValue(string.Empty);
|
||||
});
|
||||
});
|
||||
|
||||
modelBuilder.Entity<KeyExecutiveEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Id);
|
||||
entity.HasIndex(e => e.Isin);
|
||||
});
|
||||
|
||||
// FinancialStatement Configurations
|
||||
modelBuilder.Entity<FinancialStatementEntity>(entity =>
|
||||
modelBuilder.Entity<AssetEventEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Id);
|
||||
entity.HasIndex(e => e.Isin);
|
||||
// Compound Index to prevent duplicate statement entries
|
||||
entity.HasIndex(e => new { e.Isin, e.PeriodType, e.EndDate }).IsUnique();
|
||||
});
|
||||
|
||||
// ForwardEstimate Configurations
|
||||
modelBuilder.Entity<ForwardEstimateEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Id);
|
||||
entity.HasIndex(e => e.Isin);
|
||||
entity.HasIndex(e => new { e.Isin, e.Period }).IsUnique();
|
||||
});
|
||||
|
||||
// TickerFundamentals Configurations
|
||||
modelBuilder.Entity<TickerFundamentalsEntity>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.Ticker);
|
||||
entity.HasIndex(e => e.Isin);
|
||||
entity.OwnsOne(e => e.Ticker, t =>
|
||||
{
|
||||
t.Property(p => p.Ticker).HasColumnName("Ticker").HasDefaultValue(string.Empty);
|
||||
t.Property(p => p.Exchange).HasColumnName("TickerExchange").HasDefaultValue(string.Empty);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user