Compare commits

...

2 Commits

Author SHA1 Message Date
dee6bc7bef feat: add person name and insert time to announcement DTO
- Added PersonName property to AnnouncementDto to display person's full name
- Added lookup logic to fetch person names from Persons table based on phone numbers
- Added InsertTime shadow property retrieval from EF Core to display creation date
- Updated model snapshot with new shadow properties (InsertTime, IsRemoved, RemoveTime, UpdateTime) for Chat entity
2026-06-11 19:42:58 +03:30
861a98668e feat: add Auditable attribute to Chat entity and create migration
Added [Auditable] attribute to the Chat entity to enable auditing functionality. Created a new migration (AddAuditableToChat) that adds InsertTime, IsRemoved, and RemoveTime columns to the Chat table, along with the necessary database schema updates to support the auditing behavior.
2026-06-11 19:42:44 +03:30
5 changed files with 1325 additions and 17 deletions

View File

@@ -33,14 +33,37 @@ namespace Complex.Application.Services.Announcement
.Take(pageSize)
.ToList();
var result = chats.Select(c => new AnnouncementDto
// Get unique phone numbers to look up person names
var phoneNumbers = chats
.Select(c => c.PersonMobileNumber)
.Where(p => p != null)
.Distinct()
.ToList();
var personNames = _complexDBContext.Persons
.Where(p => phoneNumbers.Contains(p.Id))
.ToDictionary(p => p.Id, p => $"{p.FirstName} {p.LastName}".Trim());
var result = chats.Select(c =>
{
Id = c.Id,
ComplexId = c.ComplexId,
PersonMobileNumber = c.PersonMobileNumber,
Body = c.Body,
ChatTypeId = c.ChatTypeId,
InsertTime = null // InsertTime is set by Auditable attribute in SaveChanges, not a property on Chat entity
personNames.TryGetValue(c.PersonMobileNumber, out var personName);
// Read InsertTime from EF Core shadow property
var insertTimeEntry = _complexDBContext.Entry(c).Property("InsertTime");
var insertTime = insertTimeEntry?.CurrentValue as DateTime?;
return new AnnouncementDto
{
Id = c.Id,
ComplexId = c.ComplexId,
PersonMobileNumber = c.PersonMobileNumber,
PersonName = personName,
Body = c.Body,
ChatTypeId = c.ChatTypeId,
InsertTime = insertTime.HasValue
? insertTime.Value.ToString("yyyy/MM/dd HH:mm")
: null
};
}).ToList();
return new ResultDto<List<AnnouncementDto>>
@@ -78,6 +101,7 @@ namespace Complex.Application.Services.Announcement
public long Id { get; set; }
public Guid ComplexId { get; set; }
public string? PersonMobileNumber { get; set; }
public string? PersonName { get; set; }
public string? Body { get; set; }
public byte? ChatTypeId { get; set; }
public string? InsertTime { get; set; }

View File

@@ -2,6 +2,7 @@
namespace Complex.Domain.Entities
{
[Auditable]
public class Chat:BaseEntity<long>
{
public Guid ComplexId { set; get; }

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,258 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Complex.Infrastructure.Migrations
{
public partial class AddAuditableToChat : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "UnitStates",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 680, DateTimeKind.Local).AddTicks(2670),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 626, DateTimeKind.Local).AddTicks(1646));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "Units",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(9506),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(7151));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "UnitCosts",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 680, DateTimeKind.Local).AddTicks(1537),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(9764));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "Transactions",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(7492),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(3921));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "Persons",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(5645),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(1728));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "IncomeCostTitles",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(3528),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(9858));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "CostCycles",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(1849),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(7249));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "ComplexUnitEvents",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(795),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(5016));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "ComplexManagers",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 678, DateTimeKind.Local).AddTicks(9914),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(2426));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "ComplexEntities",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 678, DateTimeKind.Local).AddTicks(7208),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 623, DateTimeKind.Local).AddTicks(7632));
migrationBuilder.AddColumn<DateTime>(
name: "InsertTime",
table: "Chats",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 678, DateTimeKind.Local).AddTicks(4132));
migrationBuilder.AddColumn<bool>(
name: "IsRemoved",
table: "Chats",
type: "bit",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<DateTime>(
name: "RemoveTime",
table: "Chats",
type: "datetime2",
nullable: true);
migrationBuilder.AddColumn<DateTime>(
name: "UpdateTime",
table: "Chats",
type: "datetime2",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "InsertTime",
table: "Chats");
migrationBuilder.DropColumn(
name: "IsRemoved",
table: "Chats");
migrationBuilder.DropColumn(
name: "RemoveTime",
table: "Chats");
migrationBuilder.DropColumn(
name: "UpdateTime",
table: "Chats");
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "UnitStates",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 626, DateTimeKind.Local).AddTicks(1646),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 680, DateTimeKind.Local).AddTicks(2670));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "Units",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(7151),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(9506));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "UnitCosts",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(9764),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 680, DateTimeKind.Local).AddTicks(1537));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "Transactions",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(3921),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(7492));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "Persons",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(1728),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(5645));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "IncomeCostTitles",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(9858),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(3528));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "CostCycles",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(7249),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(1849));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "ComplexUnitEvents",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(5016),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(795));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "ComplexManagers",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(2426),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 678, DateTimeKind.Local).AddTicks(9914));
migrationBuilder.AlterColumn<DateTime>(
name: "InsertTime",
table: "ComplexEntities",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(2026, 6, 9, 2, 28, 45, 623, DateTimeKind.Local).AddTicks(7632),
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValue: new DateTime(2026, 6, 11, 19, 41, 56, 678, DateTimeKind.Local).AddTicks(7208));
}
}
}

View File

@@ -60,10 +60,26 @@ namespace Complex.Infrastructure.Migrations
b.Property<Guid>("ComplexId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 678, DateTimeKind.Local).AddTicks(4132));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<string>("PersonMobileNumber")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime?>("RemoveTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("UpdateTime")
.HasColumnType("datetime2");
b.HasKey("Id");
b.ToTable("Chats");
@@ -111,7 +127,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 623, DateTimeKind.Local).AddTicks(7632));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 678, DateTimeKind.Local).AddTicks(7208));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()
@@ -170,7 +186,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(2426));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 678, DateTimeKind.Local).AddTicks(9914));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()
@@ -246,7 +262,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(5016));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(795));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()
@@ -298,7 +314,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(7249));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(1849));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()
@@ -338,7 +354,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 624, DateTimeKind.Local).AddTicks(9858));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(3528));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()
@@ -386,7 +402,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(1728));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(5645));
b.Property<bool>("IsActive")
.HasColumnType("bit");
@@ -500,7 +516,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(3921));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(7492));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()
@@ -571,7 +587,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(7151));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 679, DateTimeKind.Local).AddTicks(9506));
b.Property<bool>("IsActive")
.HasColumnType("bit");
@@ -642,7 +658,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 625, DateTimeKind.Local).AddTicks(9764));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 680, DateTimeKind.Local).AddTicks(1537));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()
@@ -685,7 +701,7 @@ namespace Complex.Infrastructure.Migrations
b.Property<DateTime>("InsertTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValue(new DateTime(2026, 6, 9, 2, 28, 45, 626, DateTimeKind.Local).AddTicks(1646));
.HasDefaultValue(new DateTime(2026, 6, 11, 19, 41, 56, 680, DateTimeKind.Local).AddTicks(2670));
b.Property<bool>("IsRemoved")
.ValueGeneratedOnAdd()