34 lines
1.5 KiB
C#
34 lines
1.5 KiB
C#
using System.Globalization;
|
|
using System.Text.Json;
|
|
using System.Text.Json.Serialization;
|
|
|
|
namespace Monitor.Backend.Api;
|
|
|
|
/// <summary>时间点统一使用 RFC 3339 UTC,以 Z 结尾,精确到毫秒(唯一例外:列式时序里的时间轴 <c>t</c> 是 Unix 毫秒)。</summary>
|
|
public sealed class Rfc3339Converter : JsonConverter<DateTimeOffset>
|
|
{
|
|
private const string Format = "yyyy-MM-dd'T'HH:mm:ss.fff'Z'";
|
|
|
|
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
|
|
DateTimeOffset.Parse(reader.GetString() ?? throw new JsonException("timestamp must be a string"), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
|
|
|
|
public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) =>
|
|
writer.WriteStringValue(value.UtcDateTime.ToString(Format, CultureInfo.InvariantCulture));
|
|
}
|
|
|
|
/// <summary>RFC 9457 problem+json,附加 <c>code</c>(客户端判断的唯一依据)、<c>trace_id</c> 和 400 时的逐字段 <c>errors</c>。</summary>
|
|
public sealed record ProblemDto(
|
|
string Type,
|
|
string Title,
|
|
int Status,
|
|
string Code,
|
|
string? Detail,
|
|
string? TraceId,
|
|
IReadOnlyDictionary<string, string[]>? Errors);
|
|
|
|
public sealed record PageDto<T>(IReadOnlyList<T> Items, string? NextCursor);
|
|
|
|
public sealed record IdDto(string Id);
|
|
|
|
public sealed record HealthDto(string Status, bool Database, bool RawDirectory);
|