Erste lauffähige Version

This commit is contained in:
2026-05-27 10:58:37 +02:00
parent 3181ecaff9
commit 3b46311b09
76 changed files with 61064 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
using TodoTicketApp.Models;
namespace TodoTicketApp.Services;
public interface ITicketService
{
void AddTicket(Ticket ticket);
IEnumerable<Ticket> GetPendingTickets();
Ticket? GetNextTicket();
void CompleteTicket(Guid id);
void AddComment(Guid ticketId, TicketComment comment);
Ticket? GetTicketById(Guid id);
void UpdateTicket(Ticket ticket);
}
+67
View File
@@ -0,0 +1,67 @@
using Microsoft.EntityFrameworkCore;
using TodoTicketApp.Data;
using TodoTicketApp.Models;
namespace TodoTicketApp.Services;
public class SqliteTicketService : ITicketService
{
private readonly AppDbContext _context;
public SqliteTicketService(AppDbContext context)
{
_context = context;
}
public void AddTicket(Ticket ticket)
{
_context.Tickets.Add(ticket);
_context.SaveChanges();
}
public IEnumerable<Ticket> GetPendingTickets()
{
// Wichtig: .Include(t => t.Comments) sorgt dafür, dass die Kommentare mitgeladen werden
return _context.Tickets
.Include(t => t.Comments)
.Where(t => !t.IsCompleted)
.OrderByDescending(t => t.Priority)
.ThenBy(t => t.CreatedAt)
.ToList();
}
public Ticket? GetTicketById(Guid id)
{
return _context.Tickets
.Include(t => t.Comments)
.FirstOrDefault(t => t.Id == id);
}
public Ticket? GetNextTicket()
{
return GetPendingTickets().FirstOrDefault();
}
public void CompleteTicket(Guid id)
{
var ticket = _context.Tickets.FirstOrDefault(t => t.Id == id);
if (ticket != null)
{
ticket.IsCompleted = true;
_context.SaveChanges();
}
}
public void AddComment(Guid ticketId, TicketComment comment)
{
comment.TicketId = ticketId;
_context.Comments.Add(comment);
_context.SaveChanges();
}
public void UpdateTicket(Ticket ticket)
{
_context.Tickets.Update(ticket);
_context.SaveChanges();
}
}
+64
View File
@@ -0,0 +1,64 @@
using TodoTicketApp.Models;
namespace TodoTicketApp.Services;
public class InMemoryTicketService : ITicketService
{
// In-Memory Speicher. In einer echten App wäre das der DbContext.
private readonly List<Ticket> _tickets = new();
public void AddTicket(Ticket ticket)
{
_tickets.Add(ticket);
}
public IEnumerable<Ticket> GetPendingTickets()
{
// Hier ist deine Kernlogik:
// 1. Höchste Priorität zuerst (OrderByDescending)
// 2. Bei gleicher Priorität: Älteste zuerst (ThenBy -> FIFO-Prinzip)
return _tickets
.Where(t => !t.IsCompleted)
.OrderByDescending(t => t.Priority)
.ThenBy(t => t.CreatedAt);
}
public Ticket? GetNextTicket()
{
// Holt genau das Ticket, das als nächstes bearbeitet werden muss
return GetPendingTickets().FirstOrDefault();
}
public void CompleteTicket(Guid id)
{
var ticket = _tickets.FirstOrDefault(t => t.Id == id);
if (ticket != null)
{
ticket.IsCompleted = true;
}
}
public void AddComment(Guid ticketId, TicketComment comment)
{
var ticket = _tickets.FirstOrDefault(t => t.Id == ticketId);
if (ticket != null)
{
ticket.Comments.Add(comment);
}
}
public Ticket? GetTicketById(Guid id) => _tickets.FirstOrDefault(t => t.Id == id);
public void UpdateTicket(Ticket ticket)
{
var existing = GetTicketById(ticket.Id);
if (existing != null)
{
existing.Title = ticket.Title;
existing.Description = ticket.Description;
existing.Priority = ticket.Priority;
existing.IsCompleted = ticket.IsCompleted;
// In-Memory Update passiert hier automatisch durch Referenz,
// aber für DB-Logik wäre hier das Markieren als "Modified" nötig.
}
}
}