feat(risk-control): add repository layer
This commit is contained in:
parent
22d0427df9
commit
d6f5c00554
@ -0,0 +1,13 @@
|
|||||||
|
using Fengling.RiskControl.Domain.Aggregates.LotteryActivities;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface ILotteryActivityRepository
|
||||||
|
{
|
||||||
|
Task<LotteryActivity?> GetByIdAsync(long id);
|
||||||
|
Task<IEnumerable<LotteryActivity>> GetByMemberIdAsync(long memberId);
|
||||||
|
Task<IEnumerable<LotteryActivity>> GetRecentByMemberIdAsync(long memberId, int count);
|
||||||
|
Task AddAsync(LotteryActivity activity);
|
||||||
|
Task UpdateAsync(LotteryActivity activity);
|
||||||
|
Task DeleteAsync(LotteryActivity activity);
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskAlerts;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface IRiskAlertRepository
|
||||||
|
{
|
||||||
|
Task<RiskAlert?> GetByIdAsync(long id);
|
||||||
|
Task<IEnumerable<RiskAlert>> GetByMemberIdAsync(long memberId);
|
||||||
|
Task<IEnumerable<RiskAlert>> GetPendingAlertsAsync();
|
||||||
|
Task<IEnumerable<RiskAlert>> GetAlertsByPriorityAsync(RiskAlertPriority priority);
|
||||||
|
Task AddAsync(RiskAlert alert);
|
||||||
|
Task UpdateAsync(RiskAlert alert);
|
||||||
|
Task DeleteAsync(RiskAlert alert);
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskRules;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface IRiskRuleRepository
|
||||||
|
{
|
||||||
|
Task<RiskRule?> GetByIdAsync(long id);
|
||||||
|
Task<IEnumerable<RiskRule>> GetActiveRulesAsync();
|
||||||
|
Task<IEnumerable<RiskRule>> GetRulesByTypeAsync(RiskRuleType type);
|
||||||
|
Task<IEnumerable<RiskRule>> GetRulesForEvaluationAsync(string entityType, string actionType);
|
||||||
|
Task AddAsync(RiskRule rule);
|
||||||
|
Task UpdateAsync(RiskRule rule);
|
||||||
|
Task DeleteAsync(RiskRule rule);
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskScores;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface IRiskScoreRepository
|
||||||
|
{
|
||||||
|
Task<RiskScore?> GetByIdAsync(long id);
|
||||||
|
Task<RiskScore?> GetByMemberAndEntityAsync(long memberId, string entityType, string entityId);
|
||||||
|
Task<RiskScore?> GetActiveByMemberAndEntityTypeAsync(long memberId, string entityType);
|
||||||
|
Task<IEnumerable<RiskScore>> GetByMemberIdAsync(long memberId);
|
||||||
|
Task AddAsync(RiskScore score);
|
||||||
|
Task UpdateAsync(RiskScore score);
|
||||||
|
Task DeleteAsync(RiskScore score);
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Fengling.RiskControl.Domain.Aggregates.LotteryActivities;
|
||||||
|
using Fengling.RiskControl.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Infrastructure.Repositories;
|
||||||
|
|
||||||
|
public class LotteryActivityRepository : ILotteryActivityRepository
|
||||||
|
{
|
||||||
|
private readonly RiskControlDbContext _context;
|
||||||
|
|
||||||
|
public LotteryActivityRepository(RiskControlDbContext context)
|
||||||
|
{
|
||||||
|
_context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<LotteryActivity?> GetByIdAsync(long id)
|
||||||
|
{
|
||||||
|
return await _context.LotteryActivities.FindAsync(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<LotteryActivity>> GetByMemberIdAsync(long memberId)
|
||||||
|
{
|
||||||
|
return await _context.LotteryActivities
|
||||||
|
.Where(l => l.MemberId == memberId)
|
||||||
|
.OrderByDescending(l => l.CreatedAt)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<LotteryActivity>> GetRecentByMemberIdAsync(long memberId, int count)
|
||||||
|
{
|
||||||
|
return await _context.LotteryActivities
|
||||||
|
.Where(l => l.MemberId == memberId)
|
||||||
|
.OrderByDescending(l => l.CreatedAt)
|
||||||
|
.Take(count)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task AddAsync(LotteryActivity activity)
|
||||||
|
{
|
||||||
|
await _context.LotteryActivities.AddAsync(activity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateAsync(LotteryActivity activity)
|
||||||
|
{
|
||||||
|
_context.LotteryActivities.Update(activity);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(LotteryActivity activity)
|
||||||
|
{
|
||||||
|
_context.LotteryActivities.Remove(activity);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskAlerts;
|
||||||
|
using Fengling.RiskControl.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Infrastructure.Repositories;
|
||||||
|
|
||||||
|
public class RiskAlertRepository : IRiskAlertRepository
|
||||||
|
{
|
||||||
|
private readonly RiskControlDbContext _context;
|
||||||
|
|
||||||
|
public RiskAlertRepository(RiskControlDbContext context)
|
||||||
|
{
|
||||||
|
_context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<RiskAlert?> GetByIdAsync(long id)
|
||||||
|
{
|
||||||
|
return await _context.RiskAlerts.FindAsync(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<RiskAlert>> GetByMemberIdAsync(long memberId)
|
||||||
|
{
|
||||||
|
return await _context.RiskAlerts
|
||||||
|
.Where(a => a.MemberId == memberId)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<RiskAlert>> GetPendingAlertsAsync()
|
||||||
|
{
|
||||||
|
return await _context.RiskAlerts
|
||||||
|
.Where(a => a.Status == RiskAlertStatus.Pending)
|
||||||
|
.OrderByDescending(a => a.Priority)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<RiskAlert>> GetAlertsByPriorityAsync(RiskAlertPriority priority)
|
||||||
|
{
|
||||||
|
return await _context.RiskAlerts
|
||||||
|
.Where(a => a.Priority == priority)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task AddAsync(RiskAlert alert)
|
||||||
|
{
|
||||||
|
await _context.RiskAlerts.AddAsync(alert);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateAsync(RiskAlert alert)
|
||||||
|
{
|
||||||
|
_context.RiskAlerts.Update(alert);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(RiskAlert alert)
|
||||||
|
{
|
||||||
|
_context.RiskAlerts.Remove(alert);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskRules;
|
||||||
|
using Fengling.RiskControl.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Infrastructure.Repositories;
|
||||||
|
|
||||||
|
public class RiskRuleRepository : IRiskRuleRepository
|
||||||
|
{
|
||||||
|
private readonly RiskControlDbContext _context;
|
||||||
|
|
||||||
|
public RiskRuleRepository(RiskControlDbContext context)
|
||||||
|
{
|
||||||
|
_context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<RiskRule?> GetByIdAsync(long id)
|
||||||
|
{
|
||||||
|
return await _context.RiskRules.FindAsync(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<RiskRule>> GetActiveRulesAsync()
|
||||||
|
{
|
||||||
|
return await _context.RiskRules
|
||||||
|
.Where(r => r.IsActive)
|
||||||
|
.OrderByDescending(r => r.Priority)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<RiskRule>> GetRulesByTypeAsync(RiskRuleType type)
|
||||||
|
{
|
||||||
|
return await _context.RiskRules
|
||||||
|
.Where(r => r.RuleType == type && r.IsActive)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<RiskRule>> GetRulesForEvaluationAsync(string entityType, string actionType)
|
||||||
|
{
|
||||||
|
return await _context.RiskRules
|
||||||
|
.Where(r => r.IsActive)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task AddAsync(RiskRule rule)
|
||||||
|
{
|
||||||
|
await _context.RiskRules.AddAsync(rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateAsync(RiskRule rule)
|
||||||
|
{
|
||||||
|
_context.RiskRules.Update(rule);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(RiskRule rule)
|
||||||
|
{
|
||||||
|
_context.RiskRules.Remove(rule);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskScores;
|
||||||
|
using Fengling.RiskControl.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Infrastructure.Repositories;
|
||||||
|
|
||||||
|
public class RiskScoreRepository : IRiskScoreRepository
|
||||||
|
{
|
||||||
|
private readonly RiskControlDbContext _context;
|
||||||
|
|
||||||
|
public RiskScoreRepository(RiskControlDbContext context)
|
||||||
|
{
|
||||||
|
_context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<RiskScore?> GetByIdAsync(long id)
|
||||||
|
{
|
||||||
|
return await _context.RiskScores.FindAsync(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<RiskScore?> GetByMemberAndEntityAsync(long memberId, string entityType, string entityId)
|
||||||
|
{
|
||||||
|
return await _context.RiskScores
|
||||||
|
.FirstOrDefaultAsync(s => s.MemberId == memberId && s.EntityType == entityType && s.EntityId == entityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<RiskScore?> GetActiveByMemberAndEntityTypeAsync(long memberId, string entityType)
|
||||||
|
{
|
||||||
|
return await _context.RiskScores
|
||||||
|
.Where(s => s.MemberId == memberId && s.EntityType == entityType)
|
||||||
|
.OrderByDescending(s => s.CreatedAt)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<RiskScore>> GetByMemberIdAsync(long memberId)
|
||||||
|
{
|
||||||
|
return await _context.RiskScores
|
||||||
|
.Where(s => s.MemberId == memberId)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task AddAsync(RiskScore score)
|
||||||
|
{
|
||||||
|
await _context.RiskScores.AddAsync(score);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateAsync(RiskScore score)
|
||||||
|
{
|
||||||
|
_context.RiskScores.Update(score);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(RiskScore score)
|
||||||
|
{
|
||||||
|
_context.RiskScores.Remove(score);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
64
Fengling.RiskControl.Infrastructure/RiskControlDbContext.cs
Normal file
64
Fengling.RiskControl.Infrastructure/RiskControlDbContext.cs
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using NetCorePal.Extensions.Domain;
|
||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskRules;
|
||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskScores;
|
||||||
|
using Fengling.RiskControl.Domain.Aggregates.RiskAlerts;
|
||||||
|
using Fengling.RiskControl.Domain.Aggregates.LotteryActivities;
|
||||||
|
|
||||||
|
namespace Fengling.RiskControl.Infrastructure;
|
||||||
|
|
||||||
|
public class RiskControlDbContext : DbContext
|
||||||
|
{
|
||||||
|
public DbSet<RiskRule> RiskRules => Set<RiskRule>();
|
||||||
|
public DbSet<RiskScore> RiskScores => Set<RiskScore>();
|
||||||
|
public DbSet<RiskAlert> RiskAlerts => Set<RiskAlert>();
|
||||||
|
public DbSet<LotteryActivity> LotteryActivities => Set<LotteryActivity>();
|
||||||
|
|
||||||
|
private RiskControlDbContext() { }
|
||||||
|
|
||||||
|
public RiskControlDbContext(DbContextOptions<RiskControlDbContext> options)
|
||||||
|
: base(options)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
modelBuilder.Entity<RiskRule>(builder =>
|
||||||
|
{
|
||||||
|
builder.ToTable("rc_risk_rules");
|
||||||
|
builder.HasKey(r => r.Id);
|
||||||
|
builder.Property(r => r.Name).HasMaxLength(100).IsRequired();
|
||||||
|
builder.Property(r => r.Description).HasMaxLength(500);
|
||||||
|
builder.Property(r => r.ConfigJson).HasColumnName("config_json");
|
||||||
|
builder.Property(r => r.IsActive).HasDefaultValue(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<RiskScore>(builder =>
|
||||||
|
{
|
||||||
|
builder.ToTable("rc_risk_scores");
|
||||||
|
builder.HasKey(s => s.Id);
|
||||||
|
builder.Property(s => s.MemberId).IsRequired();
|
||||||
|
builder.Property(s => s.EntityType).HasMaxLength(50).IsRequired();
|
||||||
|
builder.Property(s => s.EntityId).HasMaxLength(100).IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<RiskAlert>(builder =>
|
||||||
|
{
|
||||||
|
builder.ToTable("rc_risk_alerts");
|
||||||
|
builder.HasKey(a => a.Id);
|
||||||
|
builder.Property(a => a.MemberId).IsRequired();
|
||||||
|
builder.Property(a => a.AlertType).HasMaxLength(50).IsRequired();
|
||||||
|
builder.Property(a => a.Description).HasMaxLength(500);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<LotteryActivity>(builder =>
|
||||||
|
{
|
||||||
|
builder.ToTable("rc_lottery_activities");
|
||||||
|
builder.HasKey(l => l.Id);
|
||||||
|
builder.Property(l => l.MemberId).IsRequired();
|
||||||
|
builder.Property(l => l.ActivityType).HasMaxLength(50).IsRequired();
|
||||||
|
builder.Property(l => l.IpAddress).HasMaxLength(50);
|
||||||
|
builder.Property(l => l.DeviceId).HasMaxLength(100);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user