diff --git a/.gitea/workflows/pipeline.yml b/.gitea/workflows/pipeline.yml index 1342e35..3f8b012 100644 --- a/.gitea/workflows/pipeline.yml +++ b/.gitea/workflows/pipeline.yml @@ -1,11 +1,11 @@ # Name Ihrer Workflow-Pipeline -name: Build and Push Backend API Docker Image +name: Branch - test - Build and Push Backend API Docker Image # Definiert, wann dieser Workflow ausgeführt werden soll on: push: branches: - - master # Wird ausgelöst bei jedem Push auf den Master-Branch + - test # Wird ausgelöst bei jedem Push auf den Master-Branch # Definition der Jobs, die in diesem Workflow ausgeführt werden jobs: @@ -39,4 +39,4 @@ jobs: # Legt fest, dass das Image nach dem Bauen in die Registry gepusht werden soll push: true # Definiert die Tags für Ihr Docker-Image in der Registry - tags: gitea.tzbre.dev/admin/shopsolution-backend:latest # WICHTIG: Eindeutiger Name für das Backend-Image \ No newline at end of file + tags: gitea.tzbre.dev/admin/shopsolution-backend:test # WICHTIG: Eindeutiger Name für das Backend-Image \ No newline at end of file diff --git a/Webshop.Api/Controllers/Admin/AdminAnalyticsController.cs b/Webshop.Api/Controllers/Admin/AdminAnalyticsController.cs index 777c5a1..0225ba2 100644 --- a/Webshop.Api/Controllers/Admin/AdminAnalyticsController.cs +++ b/Webshop.Api/Controllers/Admin/AdminAnalyticsController.cs @@ -1,9 +1,9 @@ -// src/Webshop.Api/Controllers/Admin/AdminAnalyticsController.cs -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Webshop.Application.DTOs.Admin; using Webshop.Application.Services.Admin.Interfaces; +using Webshop.Application; // Hinzugefügt namespace Webshop.Api.Controllers.Admin { @@ -26,11 +26,24 @@ namespace Webshop.Api.Controllers.Admin /// Ruft die aggregierten Analysedaten und KPIs für den Admin-Bereich ab. /// /// Der Zeitraum für die Statistiken (Last7Days, Last30Days, AllTime). Standard ist Last30Days. + /// Gibt die Analysedaten zurück. + /// Tritt auf, wenn ein interner Serverfehler beim Abrufen der Daten auftritt. [HttpGet] - public async Task> GetAnalytics([FromQuery] AnalyticsPeriod period = AnalyticsPeriod.Last30Days) + [ProducesResponseType(typeof(AnalyticsDto), 200)] + [ProducesResponseType(typeof(object), 500)] + public async Task GetAnalytics([FromQuery] AnalyticsPeriod period = AnalyticsPeriod.Last30Days) { - var stats = await _analyticsService.GetAnalyticsAsync(period); - return Ok(stats); + var result = await _analyticsService.GetAnalyticsAsync(period); + + return result.Type switch + { + ServiceResultType.Success => Ok(result.Value), + + ServiceResultType.Failure => StatusCode(500, new { message = result.ErrorMessage }), + + // Fallback für unerwartete Fehlertypen + _ => StatusCode(500, new { message = "Ein unerwarteter Fehler ist aufgetreten." }) + }; } } } \ No newline at end of file diff --git a/Webshop.Application/Services/Admin/AdminAnalyticsService.cs b/Webshop.Application/Services/Admin/AdminAnalyticsService.cs index bd2b051..c7f3ee7 100644 --- a/Webshop.Application/Services/Admin/AdminAnalyticsService.cs +++ b/Webshop.Application/Services/Admin/AdminAnalyticsService.cs @@ -1,5 +1,4 @@ -// src/Webshop.Application/Services/Admin/AdminAnalyticsService.cs -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; @@ -9,6 +8,8 @@ using Webshop.Application.Services.Admin.Interfaces; using Webshop.Domain.Enums; using Webshop.Domain.Interfaces; using Webshop.Infrastructure.Data; +using Webshop.Application; // Hinzugefügt +using Microsoft.Extensions.Logging; // Empfohlen für Logging namespace Webshop.Application.Services.Admin { @@ -16,30 +17,45 @@ namespace Webshop.Application.Services.Admin { private readonly ApplicationDbContext _context; private readonly ISettingService _settingService; + private readonly ILogger _logger; // Empfohlen: Logger hinzufügen - public AdminAnalyticsService(ApplicationDbContext context, ISettingService settingService) + // Empfohlen: Logger per Dependency Injection übergeben + public AdminAnalyticsService(ApplicationDbContext context, ISettingService settingService, ILogger logger) { _context = context; _settingService = settingService; + _logger = logger; } - public async Task GetAnalyticsAsync(AnalyticsPeriod period) + public async Task> GetAnalyticsAsync(AnalyticsPeriod period) { - var startDate = GetStartDateFromPeriod(period); - - var filteredOrders = await _context.Orders - .Where(o => o.OrderDate >= startDate && o.OrderStatus != OrderStatus.Cancelled.ToString()) - .ToListAsync(); - - var analyticsDto = new AnalyticsDto + try { - KpiSummary = await GetKpiSummaryAsync(startDate, filteredOrders), - SalesOverTime = GetSalesOverTime(filteredOrders), - TopPerformingProducts = await GetTopPerformingProductsAsync(startDate), - InventoryStatus = await GetInventoryStatusAsync() - }; + var startDate = GetStartDateFromPeriod(period); - return analyticsDto; + // Die Abfragen bleiben gleich, werden aber jetzt innerhalb des Try-Blocks ausgeführt. + var filteredOrders = await _context.Orders + .Where(o => o.OrderDate >= startDate && o.OrderStatus != OrderStatus.Cancelled.ToString()) + .ToListAsync(); + + var analyticsDto = new AnalyticsDto + { + KpiSummary = await GetKpiSummaryAsync(startDate, filteredOrders), + SalesOverTime = GetSalesOverTime(filteredOrders), + TopPerformingProducts = await GetTopPerformingProductsAsync(startDate), + InventoryStatus = await GetInventoryStatusAsync() + }; + + return ServiceResult.Ok(analyticsDto); + } + catch (Exception ex) + { + _logger.LogError(ex, "Fehler beim Abrufen der Analysedaten für den Zeitraum {Period}.", period); + return ServiceResult.Fail( + ServiceResultType.Failure, + "Ein interner Fehler ist beim Abrufen der Analysedaten aufgetreten." + ); + } } private async Task GetKpiSummaryAsync(DateTimeOffset startDate, List filteredOrders) diff --git a/Webshop.Application/Services/Admin/Interfaces/IAdminAnalyticsService.cs b/Webshop.Application/Services/Admin/Interfaces/IAdminAnalyticsService.cs index c44fa64..2e3b8e6 100644 --- a/Webshop.Application/Services/Admin/Interfaces/IAdminAnalyticsService.cs +++ b/Webshop.Application/Services/Admin/Interfaces/IAdminAnalyticsService.cs @@ -1,6 +1,6 @@ -// src/Webshop.Application/Services/Admin/Interfaces/IAdminAnalyticsService.cs -using System.Threading.Tasks; +using System.Threading.Tasks; using Webshop.Application.DTOs.Admin; +using Webshop.Application; // Hinzugefügt namespace Webshop.Application.Services.Admin.Interfaces { @@ -8,6 +8,6 @@ namespace Webshop.Application.Services.Admin.Interfaces public interface IAdminAnalyticsService { - Task GetAnalyticsAsync(AnalyticsPeriod period); + Task> GetAnalyticsAsync(AnalyticsPeriod period); } } \ No newline at end of file