Add simplified ticket completion flow

This commit is contained in:
Drechsler, Meik
2026-07-20 10:48:40 +02:00
parent 1a3bef9eeb
commit fb45f1c42b
5 changed files with 203 additions and 5 deletions

View File

@@ -1515,6 +1515,12 @@ namespace C4IT.FASD.Cockpit.Communication
return output;
}
public override async Task<bool> Matrix42TicketFinalization(cApiM42Ticket ticketData)
{
var result = await FinalizeTicketAsync(ticketData);
return result?.Success == true;
}
public override async Task<cTicketFinalizationResult> FinalizeTicketAsync(cApiM42Ticket ticketData)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
@@ -1522,7 +1528,6 @@ namespace C4IT.FASD.Cockpit.Communication
var apiError = 0;
var timeStart = DateTime.UtcNow;
bool output = false;
try
{
var http = GetHttpHelper(true);
@@ -1532,7 +1537,7 @@ namespace C4IT.FASD.Cockpit.Communication
var result = await http.PostJsonAsync(url, payload, 20000, CancellationToken.None);
if (result.IsOk)
return true;
return ParseTicketFinalizationResult(result.Result, ticketData?.Ticket);
else
apiError = (int)result.Status;
}
@@ -1547,7 +1552,102 @@ namespace C4IT.FASD.Cockpit.Communication
LogMethodEnd(CM);
}
return output;
return new cTicketFinalizationResult { Success = false };
}
internal static cTicketFinalizationResult ParseTicketFinalizationResult(string response, Guid? fallbackTicketId)
{
if (fallbackTicketId == Guid.Empty)
fallbackTicketId = null;
if (!string.IsNullOrWhiteSpace(response))
{
try
{
var token = JToken.Parse(response);
if (token.Type == JTokenType.Object)
{
var result = token.ToObject<cTicketFinalizationResult>();
if (result != null)
{
if (result.Success && (!result.TicketId.HasValue || result.TicketId.Value == Guid.Empty))
result.TicketId = fallbackTicketId;
return result;
}
}
else if (token.Type == JTokenType.String &&
Guid.TryParse(token.Value<string>(), out var createdTicketId))
{
return new cTicketFinalizationResult
{
Success = true,
TicketId = createdTicketId
};
}
}
catch (JsonException)
{
if (Guid.TryParse(response.Trim().Trim('"'), out var createdTicketId))
{
return new cTicketFinalizationResult
{
Success = true,
TicketId = createdTicketId
};
}
}
}
// Older providers returned an empty JSON value for successful updates.
return new cTicketFinalizationResult
{
Success = true,
TicketId = fallbackTicketId
};
}
public override async Task<cTicketExternalLinkResult> GetTicketExternalLinkAsync(Guid ticketId, enumTicketExternalOpenMode mode)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
var apiError = 0;
var timeStart = DateTime.UtcNow;
try
{
if (ticketId == Guid.Empty || mode == enumTicketExternalOpenMode.None)
return new cTicketExternalLinkResult { Success = false, Mode = enumTicketExternalOpenMode.None };
var http = GetHttpHelper(true);
var url = $"api/Ticketing/GetExternalLink?ticketId={ticketId:D}&mode={Uri.EscapeDataString(mode.ToString())}";
var result = await http.GetHttpJson(url, 20000, CancellationToken.None);
if (result.IsOk)
{
return JsonConvert.DeserializeObject<cTicketExternalLinkResult>(result.Result)
?? new cTicketExternalLinkResult { Success = false, Mode = enumTicketExternalOpenMode.None };
}
apiError = (int)result.Status;
}
catch (Exception E)
{
apiError = E.HResult;
LogException(E);
}
finally
{
if (Debug_apiTiming) SaveApiTimingEntry("Ticketing-GetExternalLink", timeStart, apiError);
LogMethodEnd(CM);
}
return new cTicketExternalLinkResult
{
Success = false,
Mode = enumTicketExternalOpenMode.None
};
}
public override async Task<bool> GetAgentApiAccessInfo()