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