47 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using DysonNetwork.Shared.Cache;
 | 
						|
using DysonNetwork.Shared.Models;
 | 
						|
using Microsoft.EntityFrameworkCore;
 | 
						|
 | 
						|
namespace DysonNetwork.Pass.Credit;
 | 
						|
 | 
						|
public class SocialCreditService(AppDatabase db, ICacheService cache)
 | 
						|
{
 | 
						|
    private const string CacheKeyPrefix = "account:credits:";
 | 
						|
    
 | 
						|
    public async Task<SnSocialCreditRecord> AddRecord(string reasonType, string reason, double delta, Guid accountId)
 | 
						|
    {
 | 
						|
        var record = new SnSocialCreditRecord
 | 
						|
        {
 | 
						|
            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;
 | 
						|
    }
 | 
						|
} |