51 lines
1.7 KiB
C#
51 lines
1.7 KiB
C#
using Fengling.RiskControl.Domain.Aggregates.RiskScores;
|
|
using Fengling.RiskControl.Domain.Repositories;
|
|
using MediatR;
|
|
|
|
namespace Fengling.RiskControl.Application.Events;
|
|
|
|
public class MemberRegisteredEventHandler : INotificationHandler<Fengling.Member.Domain.Events.Member.MemberRegisteredEvent>
|
|
{
|
|
private readonly IRiskScoreRepository _scoreRepository;
|
|
|
|
public MemberRegisteredEventHandler(IRiskScoreRepository scoreRepository)
|
|
{
|
|
_scoreRepository = scoreRepository;
|
|
}
|
|
|
|
public async Task Handle(Fengling.Member.Domain.Events.Member.MemberRegisteredEvent notification, CancellationToken cancellationToken)
|
|
{
|
|
var baselineScore = RiskScore.Create(
|
|
notification.MemberId,
|
|
"member_registration",
|
|
$"reg_{notification.MemberId}",
|
|
expiresAt: DateTime.UtcNow.AddDays(30));
|
|
|
|
await _scoreRepository.AddAsync(baselineScore);
|
|
}
|
|
}
|
|
|
|
public class PointsChangedEventHandler : INotificationHandler<Fengling.Member.Domain.Events.Points.PointsChangedEvent>
|
|
{
|
|
private readonly IRiskScoreRepository _scoreRepository;
|
|
|
|
public PointsChangedEventHandler(IRiskScoreRepository scoreRepository)
|
|
{
|
|
_scoreRepository = scoreRepository;
|
|
}
|
|
|
|
public async Task Handle(Fengling.Member.Domain.Events.Points.PointsChangedEvent notification, CancellationToken cancellationToken)
|
|
{
|
|
if (notification.ChangedPoints > 1000)
|
|
{
|
|
var score = RiskScore.Create(
|
|
notification.MemberId,
|
|
"large_point_change",
|
|
notification.AccountId.ToString());
|
|
|
|
score.AddRiskFactor("large_point_change", 25, $"大额积分变动: {notification.ChangedPoints}");
|
|
await _scoreRepository.AddAsync(score);
|
|
}
|
|
}
|
|
}
|