52 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Security.Cryptography;
 | |
| using System.Text;
 | |
| using DysonNetwork.Shared.Cache;
 | |
| using DysonNetwork.Shared.Proto;
 | |
| using Microsoft.AspNetCore.Authorization;
 | |
| using Microsoft.AspNetCore.Mvc;
 | |
| 
 | |
| namespace DysonNetwork.Sphere.Translation;
 | |
| 
 | |
| [ApiController]
 | |
| [Route("/api/translate")]
 | |
| public class TranslationController(ITranslationProvider provider, ICacheService cache) : ControllerBase
 | |
| {
 | |
|     private const string CacheKeyPrefix = "translation:";
 | |
| 
 | |
|     private static string GenerateCacheKey(string text, string targetLanguage)
 | |
|     {
 | |
|         var inputBytes = Encoding.UTF8.GetBytes($"{text}:{targetLanguage}");
 | |
|         var hashBytes = SHA256.HashData(inputBytes);
 | |
|         return $"{CacheKeyPrefix}{Convert.ToHexString(hashBytes)}";
 | |
|     }
 | |
| 
 | |
|     [HttpPost]
 | |
|     [Authorize]
 | |
|     public async Task<ActionResult<string>> Translate(
 | |
|         [FromBody] string text,
 | |
|         [FromQuery(Name = "to")] string targetLanguage,
 | |
|         [FromQuery(Name = "from")] string? sourceLanguage
 | |
|     )
 | |
|     {
 | |
|         if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized();
 | |
|         if (currentUser.PerkSubscription is null)
 | |
|             return StatusCode(403, "You need a subscription to use this feature.");
 | |
| 
 | |
|         // Generate cache key
 | |
|         var cacheKey = GenerateCacheKey(text, targetLanguage);
 | |
| 
 | |
|         // Try to get from cache first
 | |
|         var (found, cachedResult) = await cache.GetAsyncWithStatus<string>(cacheKey);
 | |
|         if (found && cachedResult != null)
 | |
|             return Ok(cachedResult);
 | |
| 
 | |
|         // If not in cache, translate and cache the result
 | |
|         var result = await provider.Translate(text, targetLanguage);
 | |
|         if (!string.IsNullOrEmpty(result))
 | |
|         {
 | |
|             await cache.SetAsync(cacheKey, result, TimeSpan.FromHours(24)); // Cache for 24 hours
 | |
|         }
 | |
| 
 | |
|         return result;
 | |
|     }
 | |
| } |