Fix CreatedAt to never change after being created

This commit is contained in:
Marc Hernandez 2025-11-01 15:01:09 -07:00
parent a5871e9c0b
commit 307a0b8cdc

View File

@ -63,8 +63,8 @@ public interface Obj<T> : Obj where T : Obj<T>
string reason = "Processed", string reason = "Processed",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int dbgLine = 0 , [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] string expStr = "" ); [CallerArgumentExpression( "fn" )] string expStr = "" );
/// <summary> /// <summary>
@ -128,8 +128,8 @@ public interface RecordedMeta : VersionedMeta
{ {
public string MemberName { get; } public string MemberName { get; }
public string FilePath { get; } public string FilePath { get; }
public int LineNumber { get; } public int LineNumber { get; }
public string Expression { get; } public string Expression { get; }
} }
@ -192,8 +192,8 @@ public record class Versioned<T> : Obj<T> where T : Versioned<T>
string reason = "Processed", string reason = "Processed",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int dbgLine = 0 , [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] string expStr = "" ) [CallerArgumentExpression( "fn" )] string expStr = "" )
{ {
var current = (T)this; var current = (T)this;
var next = fn( current ); var next = fn( current );
@ -245,7 +245,7 @@ public record class Recorded<T> : Versioned<T> where T : Recorded<T>
//Metadata_Versioned Obj.Meta => this.Meta; //Metadata_Versioned Obj.Meta => this.Meta;
public Recorded() { } public Recorded() { }
protected Recorded(Recorded<T> original) : base(original) { Meta = original.Meta; } protected Recorded( Recorded<T> original ) : base( original ) { Meta = original.Meta; }
public virtual T Process( public virtual T Process(
Func<T, T> fn, Func<T, T> fn,
@ -253,12 +253,13 @@ public record class Recorded<T> : Versioned<T> where T : Recorded<T>
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int dbgLine = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression("fn")] string expStr = "") [CallerArgumentExpression( "fn" )] string expStr = "" )
{ {
var current = (T)this; var current = (T)this;
var next = fn(current); var next = fn( current );
if (ReferenceEquals(current, next)) return current; if( ReferenceEquals( current, next ) )
return current;
var newMeta = new Metadata_Recorded var newMeta = new Metadata_Recorded
{ {
@ -272,7 +273,7 @@ public record class Recorded<T> : Versioned<T> where T : Recorded<T>
}; };
var newVersion = next with { Meta = newMeta, OnChange = current.OnChange }; var newVersion = next with { Meta = newMeta, OnChange = current.OnChange };
newVersion.OnChange(current, newVersion); newVersion.OnChange( current, newVersion );
return newVersion; return newVersion;
} }
@ -280,9 +281,9 @@ public record class Recorded<T> : Versioned<T> where T : Recorded<T>
string reason = "Recorded", string reason = "Recorded",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int dbgLine = 0) [CallerLineNumber] int dbgLine = 0 )
{ {
return Process(t => t, reason, dbgName, dbgPath, dbgLine ); return Process( t => t, reason, dbgName, dbgPath, dbgLine );
} }
} }
@ -294,11 +295,11 @@ public record class Timed<T> : Recorded<T> where T : Timed<T>
{ {
new public Metadata_Timed Meta { get; init; } = new(); new public Metadata_Timed Meta { get; init; } = new();
//Metadata_Versioned Obj.Meta => this.Meta; //Metadata_Versioned Obj.Meta => this.Meta;
public TimeSpan SinceLastTouch => Meta.TouchedAt - (Old?.Meta as Metadata_Timed)?.TouchedAt ?? TimeSpan.Zero; public TimeSpan SinceLastTouch => Meta.TouchedAt - ( Old?.Meta as Metadata_Timed )?.TouchedAt ?? TimeSpan.Zero;
public TimeSpan TotalAge => Meta.TouchedAt - Meta.CreatedAt; public TimeSpan TotalAge => Meta.TouchedAt - Meta.CreatedAt;
public Timed() { } public Timed() { }
protected Timed(Timed<T> original) : base(original) { Meta = original.Meta; } protected Timed( Timed<T> original ) : base( original ) { Meta = original.Meta; }
public override T Process( public override T Process(
@ -324,7 +325,7 @@ public record class Timed<T> : Recorded<T> where T : Timed<T>
LineNumber = dbgLine, LineNumber = dbgLine,
Expression = dbgExpression, Expression = dbgExpression,
OldObject = current, OldObject = current,
CreatedAt = DateTime.UtcNow, CreatedAt = current.Meta.CreatedAt,
TouchedAt = DateTime.UtcNow TouchedAt = DateTime.UtcNow
}; };
@ -338,9 +339,9 @@ public record class Timed<T> : Recorded<T> where T : Timed<T>
string reason = "Recorded", string reason = "Recorded",
[CallerMemberName] string dbgName = "", [CallerMemberName] string dbgName = "",
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int dbgLine = 0) [CallerLineNumber] int dbgLine = 0 )
{ {
return Process(t => t, reason, dbgName, dbgPath, dbgLine ); return Process( t => t, reason, dbgName, dbgPath, dbgLine );
} }
} }
@ -354,8 +355,7 @@ public static class TimedExt
[CallerFilePath] string dbgPath = "", [CallerFilePath] string dbgPath = "",
[CallerLineNumber] int dbgLine = 0, [CallerLineNumber] int dbgLine = 0,
[CallerArgumentExpression( "fn" )] string dbgExpression = "" [CallerArgumentExpression( "fn" )] string dbgExpression = ""
) ) where T : imm.Timed<T>
where T : imm.Timed<T>
{ {
obj = obj.Process( fn, reason, dbgName, dbgPath, dbgLine, dbgExpression ); obj = obj.Process( fn, reason, dbgName, dbgPath, dbgLine, dbgExpression );
return obj; return obj;