Files
MoShiro/backend/src/Monitor.Backend.Api/Contracts/CommonDtos.cs
T
2026-10-04 21:46:39 +08:00

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);