Wiederöffnen eines gelösten Tickets:
- landet jetzt in „Rückfragen" (NeedsInfo) statt „Offen".
- War es ein echt gelöstes Ticket OHNE Rückfrage, wird um mehr Infos gebeten und
„Wieder geöffnet am" (ReopenedAt) gestempelt.
- Hatte es bereits eine offene Rückfrage (z. B. manuell gelöste Rückfrage), kehrt es
ohne neuen Hinweis und ohne Zeitstempel in genau diese Frage zurück.
Löschen über die UI = Soft-Delete:
- Tickets wandern in die neue Kategorie „Gelöscht" (Papierkorb) statt entfernt zu werden.
- Von dort wiederherstellbar (POST /feedback/{id}/restore → DeletedAt = null).
- Countdown „Wird in N Tagen endgültig gelöscht"; nach 30 Tagen endgültige Löschung
(lazy beim Abruf in GET /feedback).
Außerdem: Scrollposition bleibt beim Zurück-Navigieren (z. B. nach Klick auf einen
Tier-Link) erhalten, statt an den Seitenanfang zu springen.
EF-Migration FeedbackReopenedAndSoftDelete (ReopenedAt, DeletedAt — beide nullable).
Tests: 260 Backend grün (+2 Reopen-Fälle, CRUD auf Soft-Delete umgestellt), e2e Tickets
Desktop+Phone grün (+Soft-Delete/Restore/Reopen), vitest 149.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
65 lines
2.4 KiB
C#
65 lines
2.4 KiB
C#
namespace GerbilManagerWebAPI.Dtos
|
|
{
|
|
/// <summary>FEEDBACK: payload for POST /feedback (the "Fehler melden" dialog).</summary>
|
|
public record FeedbackInput(
|
|
string Message,
|
|
string Context,
|
|
Guid? GerbilId,
|
|
Guid? LitterId,
|
|
Guid? ContactId,
|
|
string? EntityName,
|
|
string? Url,
|
|
DateTimeOffset? ClientTimestamp);
|
|
|
|
/// <summary>
|
|
/// FEEDBACK: one past Q&A turn in the ticket's thread/history.
|
|
/// Role is "maintainer" (Rückfrage) or "breeder" (Antwort).
|
|
/// </summary>
|
|
public record FeedbackThreadEntry(
|
|
string Role,
|
|
string Text,
|
|
DateTimeOffset? At);
|
|
|
|
/// <summary>FEEDBACK: response DTO for a stored report.</summary>
|
|
public record FeedbackDto(
|
|
Guid Id,
|
|
string Message,
|
|
string Context,
|
|
Guid? GerbilId,
|
|
Guid? LitterId,
|
|
Guid? ContactId,
|
|
string? EntityName,
|
|
string? Url,
|
|
DateTimeOffset? ClientTimestamp,
|
|
string? UserAgent,
|
|
DateTimeOffset CreatedAt,
|
|
string Status,
|
|
DateTimeOffset? ResolvedAt,
|
|
string? Question,
|
|
string? Answer,
|
|
DateTimeOffset? AnsweredAt,
|
|
/// <summary>Breeder-friendly changelog written on resolve (shown in the UI).</summary>
|
|
string? FixNote,
|
|
/// <summary>INTERNAL agent working memory — exposed for tooling, NEVER shown to the breeder.</summary>
|
|
string? AgentContext,
|
|
/// <summary>Earlier Q&A rounds, oldest first; the current open exchange stays in Question/Answer.</summary>
|
|
IReadOnlyList<FeedbackThreadEntry> Thread,
|
|
/// <summary>When a genuinely-resolved ticket (no pending Rückfrage) was reopened; else null.</summary>
|
|
DateTimeOffset? ReopenedAt = null,
|
|
/// <summary>Soft-delete marker: when the ticket was deleted via the UI (recoverable); else null.</summary>
|
|
DateTimeOffset? DeletedAt = null);
|
|
|
|
/// <summary>
|
|
/// FEEDBACK: payload for PUT /feedback/{id}. Edit the message and/or toggle status,
|
|
/// attach a clarifying question (Rückfrage), submit the breeder's answer, set the
|
|
/// breeder-friendly fix note (changelog), or update the internal agent context.
|
|
/// </summary>
|
|
public record FeedbackUpdate(
|
|
string? Message,
|
|
string? Status,
|
|
string? Question,
|
|
string? Answer,
|
|
string? FixNote,
|
|
string? AgentContext);
|
|
}
|