179 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
| using Microsoft.AspNetCore.Mvc;
 | |
| using BankSampahApp.Models;
 | |
| using BankSampahApp.Services;
 | |
| using System.Diagnostics;
 | |
| 
 | |
| namespace BankSampahApp.Controllers;
 | |
| 
 | |
| /// <summary>
 | |
| /// Controller utama untuk halaman Home dengan .NET 9 best practices
 | |
| /// </summary>
 | |
| [Route("")]
 | |
| [Route("[controller]")]
 | |
| public class HomeController : Controller
 | |
| {
 | |
|     private readonly ILogger<HomeController> _logger;
 | |
|     private readonly IHomeService _homeService;
 | |
|     private readonly IAppConfigurationService _appConfig;
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Constructor dengan dependency injection
 | |
|     /// </summary>
 | |
|     /// <param name="logger">Logger untuk logging</param>
 | |
|     /// <param name="homeService">Service untuk logic bisnis home</param>
 | |
|     /// <param name="appConfig">Application configuration service</param>
 | |
|     public HomeController(
 | |
|         ILogger<HomeController> logger,
 | |
|         IHomeService homeService,
 | |
|         IAppConfigurationService appConfig)
 | |
|     {
 | |
|         _logger = logger ?? throw new ArgumentNullException(nameof(logger));
 | |
|         _homeService = homeService ?? throw new ArgumentNullException(nameof(homeService));
 | |
|         _appConfig = appConfig ?? throw new ArgumentNullException(nameof(appConfig));
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Halaman utama aplikasi
 | |
|     /// </summary>
 | |
|     /// <returns>View dengan HomeViewModel</returns>
 | |
|     [HttpGet("")]
 | |
|     [HttpGet("Index")]
 | |
|     [ResponseCache(Duration = 300, Location = ResponseCacheLocation.Any, VaryByQueryKeys = new string[] { })]
 | |
|     public async Task<IActionResult> Index()
 | |
|     {
 | |
|         try
 | |
|         {
 | |
|             using var scope = _logger.BeginScope(new Dictionary<string, object>
 | |
|             {
 | |
|                 ["Action"] = nameof(Index),
 | |
|                 ["Controller"] = nameof(HomeController)
 | |
|             });
 | |
| 
 | |
|             _logger.LogInformation("Loading home page");
 | |
| 
 | |
|             var stopwatch = Stopwatch.StartNew();
 | |
|             var model = await _homeService.GetHomeViewModelAsync();
 | |
|             stopwatch.Stop();
 | |
| 
 | |
|             _logger.LogInformation("Home page loaded successfully in {ElapsedMilliseconds}ms", 
 | |
|                 stopwatch.ElapsedMilliseconds);
 | |
| 
 | |
|             // Add performance metrics to ViewBag for debugging
 | |
|             if (_appConfig.DevelopmentSettings.EnablePerformanceMetrics)
 | |
|             {
 | |
|                 ViewBag.LoadTime = stopwatch.ElapsedMilliseconds;
 | |
|             }
 | |
| 
 | |
|             return View(model);
 | |
|         }
 | |
|         catch (Exception ex)
 | |
|         {
 | |
|             _logger.LogError(ex, "Error loading home page");
 | |
|             
 | |
|             // Return error view with fallback data
 | |
|             var fallbackModel = CreateFallbackViewModel();
 | |
|             return View(fallbackModel);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Halaman kebijakan privasi
 | |
|     /// </summary>
 | |
|     /// <returns>Privacy view</returns>
 | |
|     [HttpGet("Privacy")]
 | |
|     [ResponseCache(Duration = 3600, Location = ResponseCacheLocation.Any)]
 | |
|     public IActionResult Privacy()
 | |
|     {
 | |
|         _logger.LogInformation("Privacy page accessed");
 | |
|         return View();
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Halaman error dengan enhanced error handling
 | |
|     /// </summary>
 | |
|     /// <returns>Error view dengan ErrorViewModel</returns>
 | |
|     [HttpGet("Error")]
 | |
|     [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
 | |
|     public IActionResult Error()
 | |
|     {
 | |
|         var requestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
 | |
|         
 | |
|         // Get exception details from HttpContext items (set by GlobalExceptionFilter)
 | |
|         var exception = HttpContext.Items["Exception"] as Exception;
 | |
|         var storedRequestId = HttpContext.Items["RequestId"] as string;
 | |
| 
 | |
|         _logger.LogWarning("Error page accessed. RequestId: {RequestId}, HasException: {HasException}", 
 | |
|             requestId, exception != null);
 | |
| 
 | |
|         var model = new ErrorViewModel 
 | |
|         { 
 | |
|             RequestId = storedRequestId ?? requestId
 | |
|         };
 | |
| 
 | |
|         // Add additional debug info in development
 | |
|         if (_appConfig.ShowDetailedExceptions)
 | |
|         {
 | |
|             ViewBag.ExceptionMessage = exception?.Message;
 | |
|             ViewBag.ExceptionType = exception?.GetType().Name;
 | |
|         }
 | |
| 
 | |
|         return View(model);
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// API endpoint untuk mendapatkan statistik (untuk AJAX calls)
 | |
|     /// </summary>
 | |
|     /// <returns>JSON dengan statistik terkini</returns>
 | |
|     [HttpGet("api/statistics")]
 | |
|     [ResponseCache(Duration = 900, Location = ResponseCacheLocation.Any)]
 | |
|     public async Task<IActionResult> GetStatistics()
 | |
|     {
 | |
|         try
 | |
|         {
 | |
|             _logger.LogDebug("API statistics endpoint called");
 | |
| 
 | |
|             var statistics = await _homeService.GetStatisticsAsync();
 | |
|             
 | |
|             return Json(new
 | |
|             {
 | |
|                 success = true,
 | |
|                 data = statistics,
 | |
|                 timestamp = DateTime.UtcNow
 | |
|             });
 | |
|         }
 | |
|         catch (Exception ex)
 | |
|         {
 | |
|             _logger.LogError(ex, "Error fetching statistics via API");
 | |
|             
 | |
|             return Json(new
 | |
|             {
 | |
|                 success = false,
 | |
|                 error = "Unable to fetch statistics",
 | |
|                 timestamp = DateTime.UtcNow
 | |
|             });
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Create fallback view model saat terjadi error
 | |
|     /// </summary>
 | |
|     /// <returns>Fallback HomeViewModel</returns>
 | |
|     private HomeViewModel CreateFallbackViewModel()
 | |
|     {
 | |
|         _logger.LogWarning("Creating fallback view model due to error");
 | |
|         
 | |
|         return new HomeViewModel
 | |
|         {
 | |
|             Title = _appConfig.ApplicationName,
 | |
|             Subtitle = "Layanan sedang dalam pemeliharaan, silakan coba lagi nanti.",
 | |
|             Features = new List<FeatureModel>(),
 | |
|             Statistics = new StatisticsModel
 | |
|             {
 | |
|                 TotalUsers = 0,
 | |
|                 WasteCollected = 0,
 | |
|                 RewardsDistributed = 0,
 | |
|                 EnvironmentImpact = 0
 | |
|             }
 | |
|         };
 | |
|     }
 | |
| } |