diff --git a/URL-Shortener/Controllers/ShortUrlController.cs b/URL-Shortener/Controllers/ShortUrlController.cs index ad58ccc..876a657 100644 --- a/URL-Shortener/Controllers/ShortUrlController.cs +++ b/URL-Shortener/Controllers/ShortUrlController.cs @@ -70,6 +70,8 @@ namespace URL_Shortener.Controllers if (dto.ResetExpirationDateTime) shortUrl.ExpirationDateTime = null; + shortUrl.UpdateDateTime = DateTime.UtcNow; + await _db.SaveChangesAsync(); return Ok(shortUrl); diff --git a/URL-Shortener/Migrations/20260514100330_AddUpdateDateTime.Designer.cs b/URL-Shortener/Migrations/20260514100330_AddUpdateDateTime.Designer.cs new file mode 100644 index 0000000..15f162c --- /dev/null +++ b/URL-Shortener/Migrations/20260514100330_AddUpdateDateTime.Designer.cs @@ -0,0 +1,119 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using URL_Shortener; + +#nullable disable + +namespace URL_Shortener.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20260514100330_AddUpdateDateTime")] + partial class AddUpdateDateTime + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("URL_Shortener.Models.ClickInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClickDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("ShortUrlId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ClickInfos"); + }); + + modelBuilder.Entity("URL_Shortener.Models.ShortUrl", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClickLimit") + .HasColumnType("integer"); + + b.Property("CreationDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpirationDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("OriginalUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("ShortCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("TotalClickCount") + .HasColumnType("integer"); + + b.Property("UpdateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ShortUrls"); + }); + + modelBuilder.Entity("URL_Shortener.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("HashedPassword") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastLoginDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("RegisterDate") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/URL-Shortener/Migrations/20260514100330_AddUpdateDateTime.cs b/URL-Shortener/Migrations/20260514100330_AddUpdateDateTime.cs new file mode 100644 index 0000000..b3235c5 --- /dev/null +++ b/URL-Shortener/Migrations/20260514100330_AddUpdateDateTime.cs @@ -0,0 +1,30 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace URL_Shortener.Migrations +{ + /// + public partial class AddUpdateDateTime : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "UpdateDateTime", + table: "ShortUrls", + type: "timestamp with time zone", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "UpdateDateTime", + table: "ShortUrls"); + } + } +} diff --git a/URL-Shortener/Migrations/AppDbContextModelSnapshot.cs b/URL-Shortener/Migrations/AppDbContextModelSnapshot.cs index 960df17..aee394e 100644 --- a/URL-Shortener/Migrations/AppDbContextModelSnapshot.cs +++ b/URL-Shortener/Migrations/AppDbContextModelSnapshot.cs @@ -69,6 +69,9 @@ namespace URL_Shortener.Migrations b.Property("TotalClickCount") .HasColumnType("integer"); + b.Property("UpdateDateTime") + .HasColumnType("timestamp with time zone"); + b.Property("UserId") .HasColumnType("integer"); diff --git a/URL-Shortener/Models/ShortUrl.cs b/URL-Shortener/Models/ShortUrl.cs index a9acb15..5036b7e 100644 --- a/URL-Shortener/Models/ShortUrl.cs +++ b/URL-Shortener/Models/ShortUrl.cs @@ -8,6 +8,7 @@ public string ShortCode { get; set; } = string.Empty; public int TotalClickCount { get; set; } public DateTime CreationDateTime { get; set; } = DateTime.UtcNow; + public DateTime UpdateDateTime { get; set; } = DateTime.UtcNow; public DateTime? ExpirationDateTime { get; set; } = null; public int ClickLimit { get; set; } = 0; }