Contracts Layer (ServiceDeskLite.Contracts)
All public HTTP types are versioned under V1/. Enum properties in responses are strings (not numeric), enforced by JsonStringEnumConverter in the API.
Request / Response DTOs
// POST /api/v1/tickets
public sealed record CreateTicketRequest(
string Title,
string Description,
TicketPriority Priority,
DateTimeOffset? DueAt);
public sealed record CreateTicketResponse(Guid Id);
// POST /api/v1/tickets/{id}/status
public sealed record ChangeTicketStatusRequest(TicketStatus NewStatus);
// GET /api/v1/tickets/{id}
public sealed record TicketResponse(
Guid Id,
string Title,
string Description,
string Priority, // string – serialized enum value
string Status, // string – serialized enum value
DateTimeOffset CreatedAt,
DateTimeOffset? DueAt);
// GET /api/v1/tickets
public sealed record SearchTicketsRequest(
int Page = 1,
int PageSize = 25,
TicketSortField? SortField = null,
SortDirection? SortDirection = null);
public sealed record TicketListItemResponse(
Guid Id,
string Title,
string Priority,
string Status,
DateTimeOffset CreatedAt,
DateTimeOffset? DueAt);
public sealed record PagedResponse<T>(
IReadOnlyList<T> Items,
int Page,
int PageSize,
int TotalCount)
{
public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);
public bool HasPreviousPage => Page > 1;
public bool HasNextPage => Page < TotalPages;
}
Contracts Enums
public enum TicketPriority { Low, Medium, High, Critical }
public enum TicketStatus { New, Triaged, InProgress, Waiting, Resolved, Closed }
public enum TicketSortField { CreatedAt, DueAt, Priority, Status, Title }
public enum SortDirection { Asc, Desc }
ProblemDetails Extension Keys
public static class ContractsProblemDetailsConventions
{
public static class ExtensionKeys
{
public const string Code = "code";
public const string ErrorType = "errorType";
public const string Meta = "meta";
public const string TraceId = "traceId";
}
}