46 lines
1.5 KiB
C#
46 lines
1.5 KiB
C#
using DysonNetwork.Shared.Cache;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace DysonNetwork.Pass.Credit;
|
|
|
|
public class SocialCreditService(AppDatabase db, ICacheService cache)
|
|
{
|
|
private const string CacheKeyPrefix = "account:credits:";
|
|
|
|
public async Task<SocialCreditRecord> AddRecord(string reasonType, string reason, double delta, Guid accountId)
|
|
{
|
|
var record = new SocialCreditRecord
|
|
{
|
|
ReasonType = reasonType,
|
|
Reason = reason,
|
|
Delta = delta,
|
|
AccountId = accountId,
|
|
};
|
|
db.SocialCreditRecords.Add(record);
|
|
await db.SaveChangesAsync();
|
|
|
|
await db.AccountProfiles
|
|
.Where(p => p.AccountId == accountId)
|
|
.ExecuteUpdateAsync(p => p.SetProperty(v => v.SocialCredits, v => v.SocialCredits + record.Delta));
|
|
|
|
await cache.RemoveAsync($"{CacheKeyPrefix}{accountId}");
|
|
|
|
return record;
|
|
}
|
|
|
|
private const double BaseSocialCredit = 100;
|
|
|
|
public async Task<double> GetSocialCredit(Guid accountId)
|
|
{
|
|
var cached = await cache.GetAsync<double?>($"{CacheKeyPrefix}{accountId}");
|
|
if (cached.HasValue) return cached.Value;
|
|
|
|
var records = await db.SocialCreditRecords
|
|
.Where(x => x.AccountId == accountId)
|
|
.SumAsync(x => x.Delta);
|
|
records += BaseSocialCredit;
|
|
|
|
await cache.SetAsync($"{CacheKeyPrefix}{accountId}", records);
|
|
return records;
|
|
}
|
|
} |