using System.Buffers.Binary; using System.Security.Cryptography; using MongoDB.Bson; namespace PrivaPub.Infrastructure.Ids { public static class PrivacyIds { public static string ForDay(DateTime when) => At(DateTime.SpecifyKind(when, DateTimeKind.Utc).Date); public static string Arrived(DateTime published) => DateTime.SpecifyKind(published, DateTimeKind.Utc) > DateTime.UtcNow - LiveWindow ? ObjectId.GenerateNewId().ToString() : At(published); static readonly TimeSpan LiveWindow = TimeSpan.FromHours(1); public static string At(DateTime when) { var seconds = Math.Clamp(new DateTimeOffset(DateTime.SpecifyKind(when, DateTimeKind.Utc)).ToUnixTimeSeconds(), 0, DateTimeOffset.UtcNow.AddDays(1).ToUnixTimeSeconds()); Span bytes = stackalloc byte[12]; BinaryPrimitives.WriteInt32BigEndian(bytes, (int)seconds); RandomNumberGenerator.Fill(bytes[4..]); return Convert.ToHexStringLower(bytes); } } }