50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using DysonNetwork.Shared.Cache;
 | 
						|
using DysonNetwork.Shared.Proto;
 | 
						|
using Microsoft.AspNetCore.Authorization;
 | 
						|
using Microsoft.AspNetCore.Mvc;
 | 
						|
 | 
						|
namespace DysonNetwork.Drive.Billing;
 | 
						|
 | 
						|
[ApiController]
 | 
						|
[Route("api/billing/usage")]
 | 
						|
public class UsageController(UsageService usage, QuotaService quota, ICacheService cache) : ControllerBase
 | 
						|
{
 | 
						|
    [HttpGet]
 | 
						|
    [Authorize]
 | 
						|
    public async Task<ActionResult<TotalUsageDetails>> GetTotalUsage()
 | 
						|
    {
 | 
						|
        if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized();
 | 
						|
        var accountId = Guid.Parse(currentUser.Id);
 | 
						|
        
 | 
						|
        var cacheKey = $"file:usage:{accountId}";
 | 
						|
        
 | 
						|
        // Try to get from cache first
 | 
						|
        var (found, cachedResult) = await cache.GetAsyncWithStatus<TotalUsageDetails>(cacheKey);
 | 
						|
        if (found && cachedResult != null)
 | 
						|
            return Ok(cachedResult);
 | 
						|
 | 
						|
        // If not in cache, get from services
 | 
						|
        var result = await usage.GetTotalUsage(accountId);
 | 
						|
        var totalQuota = await quota.GetQuota(accountId);
 | 
						|
        result.TotalQuota = totalQuota;
 | 
						|
 | 
						|
        // Cache the result for 5 minutes
 | 
						|
        await cache.SetAsync(cacheKey, result, TimeSpan.FromMinutes(5));
 | 
						|
 | 
						|
        return Ok(result);
 | 
						|
    }
 | 
						|
 | 
						|
    [Authorize]
 | 
						|
    [HttpGet("{poolId:guid}")]
 | 
						|
    public async Task<ActionResult<UsageDetails>> GetPoolUsage(Guid poolId)
 | 
						|
    {
 | 
						|
        if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized();
 | 
						|
        var accountId = Guid.Parse(currentUser.Id);
 | 
						|
        
 | 
						|
        var usageDetails = await usage.GetPoolUsage(poolId, accountId);
 | 
						|
        if (usageDetails == null)
 | 
						|
            return NotFound();
 | 
						|
        return usageDetails;
 | 
						|
    }
 | 
						|
}
 |