Return ticket IDs and resolve external links

This commit is contained in:
Drechsler, Meik
2026-07-20 10:38:34 +02:00
parent a3fa0e0c54
commit 02fabc91cf
11 changed files with 215 additions and 12 deletions

View File

@@ -15,6 +15,8 @@
<TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="ifRequired" />
<UseSimplifiedCaseCompletionDialog Policy="Hidden" Value="false" />
<SimplifiedCaseCompletionTicketOpenMode Policy="Hidden" Value="Preview" />
<NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="false" />
<TicketProcessing Policy="Mandatory" Value="extern">

View File

@@ -18,32 +18,55 @@ namespace F4SDwebService.Controllers.Matrix42
public async Task<IHttpActionResult> Matrix42TicketFinalization([FromBody] cApiM42Ticket jsonRequest)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var requestInfo = new cF4sdWebRequestInfo("Matrix42TicketFinalization", jsonRequest.Action?.ToString() + " + " + jsonRequest.Ticket?.ToString() ?? "", cAuthentication.GetUserInfo(ActionContext));
var requestInfo = new cF4sdWebRequestInfo("Matrix42TicketFinalization", jsonRequest?.Action?.ToString() + " + " + jsonRequest?.Ticket?.ToString() ?? "", cAuthentication.GetUserInfo(ActionContext));
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceStart(0, requestInfo.requestName, requestInfo.id, requestInfo.created); }
var apiError = 0;
try
{
if (jsonRequest == null)
return BadRequest();
if (string.Equals(jsonRequest.StatusIdValue, "Closed", StringComparison.InvariantCultureIgnoreCase))
await WebApiApplication.Collector.M42WpmCollector.ReopenM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
string operationResult = null;
switch (jsonRequest.Action)
{
case enumCloseCaseTicketStatus.Save:
if (jsonRequest.Ticket == null || jsonRequest.Ticket.HasValue && jsonRequest.Ticket.Equals(Guid.Empty))
return Ok(await WebApiApplication.Collector.M42WpmCollector.CreateM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None));
operationResult = await WebApiApplication.Collector.M42WpmCollector.CreateM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
else
return Ok(await WebApiApplication.Collector.M42WpmCollector.UpdateM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None));
operationResult = await WebApiApplication.Collector.M42WpmCollector.UpdateM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
break;
case enumCloseCaseTicketStatus.Close:
return Ok(await WebApiApplication.Collector.M42WpmCollector.CloseM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None));
operationResult = await WebApiApplication.Collector.M42WpmCollector.CloseM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
break;
case enumCloseCaseTicketStatus.OnHold:
return Ok(await WebApiApplication.Collector.M42WpmCollector.PauseM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None));
operationResult = await WebApiApplication.Collector.M42WpmCollector.PauseM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
break;
case enumCloseCaseTicketStatus.Forward:
return Ok(await WebApiApplication.Collector.M42WpmCollector.ForwardM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None));
default: break;
operationResult = await WebApiApplication.Collector.M42WpmCollector.ForwardM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
break;
default:
return BadRequest();
}
return Ok(jsonRequest);
if (operationResult == null)
return InternalServerError();
var ticketId = jsonRequest.Ticket;
if ((!ticketId.HasValue || ticketId.Value == Guid.Empty) && Guid.TryParse(operationResult, out var createdTicketId))
ticketId = createdTicketId;
if (!ticketId.HasValue || ticketId.Value == Guid.Empty)
return InternalServerError();
return Ok(new cTicketFinalizationResult
{
Success = true,
TicketId = ticketId
});
}
catch (Exception E)
{
@@ -60,4 +83,4 @@ namespace F4SDwebService.Controllers.Matrix42
return BadRequest();
}
}
}
}

View File

@@ -0,0 +1,58 @@
using C4IT.DataHistoryProvider;
using C4IT.FASD.Base;
using C4IT.Logging;
using F4SDwebService;
using System;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
using static C4IT.Logging.cLogManager;
namespace FasdWebService.Controllers
{
[RoutePrefix("api/Ticketing")]
public class TicketingController : ApiController
{
[HttpGet]
[Route("GetExternalLink")]
public async Task<IHttpActionResult> GetExternalLink(Guid ticketId, enumTicketExternalOpenMode mode)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var requestInfo = new cF4sdWebRequestInfo("Ticketing.GetExternalLink", ticketId.ToString(), cAuthentication.GetUserInfo(ActionContext));
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceStart(0, requestInfo.requestName, requestInfo.id, requestInfo.created); }
var apiError = 0;
try
{
if (ticketId == Guid.Empty || mode == enumTicketExternalOpenMode.None)
return BadRequest();
var result = await WebApiApplication.Collector.GetTicketExternalLinkAsync(ticketId, mode, requestInfo, 1, CancellationToken.None);
return Ok(result ?? new cTicketExternalLinkResult
{
Success = false,
Mode = enumTicketExternalOpenMode.None
});
}
catch (Exception E)
{
apiError = E.HResult;
LogException(E);
}
finally
{
if (WebApiApplication.Debug_apiTiming) WebApiApplication.SaveApiTimingEntry(requestInfo.requestName, requestInfo.id, requestInfo.created, apiError);
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceEnd(0, requestInfo.requestName, requestInfo.id, requestInfo.created, requestInfo.created, ErrorCode: apiError); }
if (CM != null) LogMethodEnd(CM);
}
return Ok(new cTicketExternalLinkResult
{
Success = false,
Mode = enumTicketExternalOpenMode.None
});
}
}
}

View File

@@ -324,6 +324,7 @@
<Compile Include="Controllers\RemoteDesktopController.cs" />
<Compile Include="Controllers\SearchDefault.cs" />
<Compile Include="Controllers\F4SDAnalyticsDataController.cs" />
<Compile Include="Controllers\TicketingController.cs" />
<Compile Include="Controllers\TicketOverviewController.cs" />
<Compile Include="Controllers\StagedSearchRelationController.cs" />
<Compile Include="Controllers\UsageController.cs" />

View File

@@ -15,6 +15,8 @@
<TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="ifRequired" />
<UseSimplifiedCaseCompletionDialog Policy="Hidden" Value="false" />
<SimplifiedCaseCompletionTicketOpenMode Policy="Hidden" Value="Preview" />
<NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="false" />
<TicketProcessing Policy="Mandatory" Value="extern">

View File

@@ -44,6 +44,14 @@
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TicketExternalOpenModeEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="None"/>
<xs:enumeration value="Preview"/>
<xs:enumeration value="Edit"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="HorizontalAlignmentEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="Default"/>
@@ -150,6 +158,22 @@
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="UseSimplifiedCaseCompletionDialog" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="BoolNode"></xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="SimplifiedCaseCompletionTicketOpenMode" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="PolicyNode">
<xs:attribute name="Value" type="TicketExternalOpenModeEnum" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="ShowOverview" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
@@ -187,7 +211,7 @@
<xs:attribute name="Value" type="xs:boolean" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="OverviewPollingPersonal" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>