Social credit validation and recalculation

This commit is contained in:
2025-11-02 02:11:34 +08:00
parent 70fdc247e7
commit 5e5f4528b9
9 changed files with 2826 additions and 14 deletions

View File

@@ -1,6 +1,7 @@
using DysonNetwork.Shared.Cache;
using DysonNetwork.Shared.Models;
using Microsoft.EntityFrameworkCore;
using NodaTime;
namespace DysonNetwork.Pass.Credit;
@@ -35,13 +36,37 @@ public class SocialCreditService(AppDatabase db, ICacheService cache)
{
var cached = await cache.GetAsync<double?>($"{CacheKeyPrefix}{accountId}");
if (cached.HasValue) return cached.Value;
var records = await db.SocialCreditRecords
.Where(x => x.AccountId == accountId)
.Where(x => x.AccountId == accountId && x.Status == SocialCreditRecordStatus.Active)
.SumAsync(x => x.Delta);
records += BaseSocialCredit;
await cache.SetAsync($"{CacheKeyPrefix}{accountId}", records);
return records;
}
}
public async Task ValidateSocialCredits()
{
var now = SystemClock.Instance.GetCurrentInstant();
var expiredRecords = await db.SocialCreditRecords
.Where(r => r.Status == SocialCreditRecordStatus.Active && r.ExpiredAt.HasValue && r.ExpiredAt <= now)
.Select(r => new { r.Id, r.AccountId, r.Delta })
.ToListAsync();
var groupedExpired = expiredRecords.GroupBy(er => er.AccountId)
.ToDictionary(g => g.Key, g => g.Sum(er => er.Delta));
foreach (var (accountId, totalDeltaSubtracted) in groupedExpired)
{
await db.AccountProfiles
.Where(p => p.AccountId == accountId)
.ExecuteUpdateAsync(p => p.SetProperty(v => v.SocialCredits, v => v.SocialCredits - totalDeltaSubtracted));
await cache.RemoveAsync($"{CacheKeyPrefix}{accountId}");
}
await db.SocialCreditRecords
.Where(r => r.Status == SocialCreditRecordStatus.Active && r.ExpiredAt.HasValue && r.ExpiredAt <= now)
.ExecuteUpdateAsync(r => r.SetProperty(x => x.Status, SocialCreditRecordStatus.Expired));
}
}