diff --git a/AceJobAgency/AceJobAgency.csproj b/AceJobAgency/AceJobAgency.csproj index 8b42b96..94b379c 100644 --- a/AceJobAgency/AceJobAgency.csproj +++ b/AceJobAgency/AceJobAgency.csproj @@ -8,12 +8,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/AceJobAgency/Controllers/UserController.cs b/AceJobAgency/Controllers/UserController.cs index f35cf71..8351f57 100644 --- a/AceJobAgency/Controllers/UserController.cs +++ b/AceJobAgency/Controllers/UserController.cs @@ -1,5 +1,4 @@ -using System.Diagnostics; -using AceJobAgency.Data; +using AceJobAgency.Data; using AceJobAgency.Entities; using Microsoft.AspNetCore.Mvc; @@ -12,8 +11,12 @@ namespace AceJobAgency.Controllers [HttpPost] public async Task Register(User user) { - var userExists = context.Users.Any(u => u.Email == user.Email); - if (userExists) + var userEmailExists = context.Users.Any(u => u.Email == user.Email); + var userNationalRegistrationIdentityCardNumberExists = context.Users.Any( + u => u.NationalRegistrationIdentityCardNumber + == user.NationalRegistrationIdentityCardNumber + ); + if (userEmailExists || userNationalRegistrationIdentityCardNumberExists) { return BadRequest("User with the same email already exists."); } @@ -23,6 +26,7 @@ namespace AceJobAgency.Controllers user.Password = passwordHash; var userId = Guid.NewGuid().ToString(); user.Id = userId; + user.IsActive = 1; await context.Users.AddAsync(user); await context.SaveChangesAsync(); diff --git a/AceJobAgency/Data/DataContext.cs b/AceJobAgency/Data/DataContext.cs index 9e62b38..a5d3c3b 100644 --- a/AceJobAgency/Data/DataContext.cs +++ b/AceJobAgency/Data/DataContext.cs @@ -12,7 +12,7 @@ namespace AceJobAgency.Data "DefaultConnection"); if (connectionString != null) { - optionsBuilder.UseMySQL(connectionString); + optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); } } public DbSet Users { get; set; } diff --git a/AceJobAgency/Entities/User.cs b/AceJobAgency/Entities/User.cs index 0ce626e..8228ddc 100644 --- a/AceJobAgency/Entities/User.cs +++ b/AceJobAgency/Entities/User.cs @@ -5,6 +5,7 @@ namespace AceJobAgency.Entities public class User { [Key] + [MaxLength(36)] public required string Id { get; set; } [Required] @@ -20,22 +21,34 @@ namespace AceJobAgency.Entities [Required] [StringLength(9, MinimumLength = 9)] - public required string NRIC { get; set; } + public required string NationalRegistrationIdentityCardNumber { get; set; } [Required] [EmailAddress] + [MaxLength(128)] public required string Email { get; set; } [Required] [DataType(DataType.Password)] + [MaxLength(128)] public required string Password { get; set; } [Required] [DataType(DataType.Date)] public required DateTime DateOfBirth { get; set; } + [MaxLength(128)] public required string ResumeName { get; set; } - public required string WhoAmI { get; set; } + [MaxLength(255)] + public string WhoAmI { get; set; } = string.Empty; + + public int IsActive { get; set; } = 1; + + [DataType(DataType.Date)] + public DateTime CreatedAt { get; init; } = DateTime.Now; + + [DataType(DataType.Date)] + public DateTime UpdatedAt { get; set; } = DateTime.Now; } } \ No newline at end of file diff --git a/AceJobAgency/Migrations/20250206173504_Added_User.cs b/AceJobAgency/Migrations/20250206173504_Added_User.cs deleted file mode 100644 index a8112ac..0000000 --- a/AceJobAgency/Migrations/20250206173504_Added_User.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace AceJobAgency.Migrations -{ - /// - public partial class Added_User : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterDatabase() - .Annotation("MySQL:Charset", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "Users", - columns: table => new - { - Id = table.Column(type: "varchar(255)", nullable: false), - FirstName = table.Column(type: "varchar(50)", maxLength: 50, nullable: false), - LastName = table.Column(type: "varchar(50)", maxLength: 50, nullable: false), - Gender = table.Column(type: "int", nullable: false), - NRIC = table.Column(type: "varchar(9)", maxLength: 9, nullable: false), - Email = table.Column(type: "longtext", nullable: false), - Password = table.Column(type: "longtext", nullable: false), - DateOfBirth = table.Column(type: "datetime(6)", nullable: false), - ResumeName = table.Column(type: "longtext", nullable: false), - WhoAmI = table.Column(type: "longtext", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Users", x => x.Id); - }) - .Annotation("MySQL:Charset", "utf8mb4"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Users"); - } - } -} diff --git a/AceJobAgency/Migrations/20250206173504_Added_User.Designer.cs b/AceJobAgency/Migrations/20250207071719_AddedUser.Designer.cs similarity index 64% rename from AceJobAgency/Migrations/20250206173504_Added_User.Designer.cs rename to AceJobAgency/Migrations/20250207071719_AddedUser.Designer.cs index d8e56da..db045eb 100644 --- a/AceJobAgency/Migrations/20250206173504_Added_User.Designer.cs +++ b/AceJobAgency/Migrations/20250207071719_AddedUser.Designer.cs @@ -3,6 +3,7 @@ using System; using AceJobAgency.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; @@ -11,28 +12,35 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace AceJobAgency.Migrations { [DbContext(typeof(DataContext))] - [Migration("20250206173504_Added_User")] - partial class Added_User + [Migration("20250207071719_AddedUser")] + partial class AddedUser { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.11") + .HasAnnotation("ProductVersion", "8.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 64); + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + modelBuilder.Entity("AceJobAgency.Entities.User", b => { b.Property("Id") - .HasColumnType("varchar(255)"); + .HasMaxLength(36) + .HasColumnType("varchar(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); b.Property("DateOfBirth") .HasColumnType("datetime(6)"); b.Property("Email") .IsRequired() - .HasColumnType("longtext"); + .HasMaxLength(128) + .HasColumnType("varchar(128)"); b.Property("FirstName") .IsRequired() @@ -42,27 +50,36 @@ namespace AceJobAgency.Migrations b.Property("Gender") .HasColumnType("int"); + b.Property("IsActive") + .HasColumnType("int"); + b.Property("LastName") .IsRequired() .HasMaxLength(50) .HasColumnType("varchar(50)"); - b.Property("NRIC") + b.Property("NationalRegistrationIdentityCardNumber") .IsRequired() .HasMaxLength(9) .HasColumnType("varchar(9)"); b.Property("Password") .IsRequired() - .HasColumnType("longtext"); + .HasMaxLength(128) + .HasColumnType("varchar(128)"); b.Property("ResumeName") .IsRequired() - .HasColumnType("longtext"); + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); b.Property("WhoAmI") .IsRequired() - .HasColumnType("longtext"); + .HasMaxLength(255) + .HasColumnType("varchar(255)"); b.HasKey("Id"); diff --git a/AceJobAgency/Migrations/20250207071719_AddedUser.cs b/AceJobAgency/Migrations/20250207071719_AddedUser.cs new file mode 100644 index 0000000..deeff7d --- /dev/null +++ b/AceJobAgency/Migrations/20250207071719_AddedUser.cs @@ -0,0 +1,57 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AceJobAgency.Migrations +{ + /// + public partial class AddedUser : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + Id = table.Column(type: "varchar(36)", maxLength: 36, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + FirstName = table.Column(type: "varchar(50)", maxLength: 50, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + LastName = table.Column(type: "varchar(50)", maxLength: 50, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Gender = table.Column(type: "int", nullable: false), + NationalRegistrationIdentityCardNumber = table.Column(type: "varchar(9)", maxLength: 9, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Email = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Password = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + DateOfBirth = table.Column(type: "datetime(6)", nullable: false), + ResumeName = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + WhoAmI = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + IsActive = table.Column(type: "int", nullable: false), + CreatedAt = table.Column(type: "datetime(6)", nullable: false), + UpdatedAt = table.Column(type: "datetime(6)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Users"); + } + } +} diff --git a/AceJobAgency/Migrations/DataContextModelSnapshot.cs b/AceJobAgency/Migrations/DataContextModelSnapshot.cs index 05513ba..963de11 100644 --- a/AceJobAgency/Migrations/DataContextModelSnapshot.cs +++ b/AceJobAgency/Migrations/DataContextModelSnapshot.cs @@ -3,6 +3,7 @@ using System; using AceJobAgency.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable @@ -16,20 +17,27 @@ namespace AceJobAgency.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.11") + .HasAnnotation("ProductVersion", "8.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 64); + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + modelBuilder.Entity("AceJobAgency.Entities.User", b => { b.Property("Id") - .HasColumnType("varchar(255)"); + .HasMaxLength(36) + .HasColumnType("varchar(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); b.Property("DateOfBirth") .HasColumnType("datetime(6)"); b.Property("Email") .IsRequired() - .HasColumnType("longtext"); + .HasMaxLength(128) + .HasColumnType("varchar(128)"); b.Property("FirstName") .IsRequired() @@ -39,27 +47,36 @@ namespace AceJobAgency.Migrations b.Property("Gender") .HasColumnType("int"); + b.Property("IsActive") + .HasColumnType("int"); + b.Property("LastName") .IsRequired() .HasMaxLength(50) .HasColumnType("varchar(50)"); - b.Property("NRIC") + b.Property("NationalRegistrationIdentityCardNumber") .IsRequired() .HasMaxLength(9) .HasColumnType("varchar(9)"); b.Property("Password") .IsRequired() - .HasColumnType("longtext"); + .HasMaxLength(128) + .HasColumnType("varchar(128)"); b.Property("ResumeName") .IsRequired() - .HasColumnType("longtext"); + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); b.Property("WhoAmI") .IsRequired() - .HasColumnType("longtext"); + .HasMaxLength(255) + .HasColumnType("varchar(255)"); b.HasKey("Id");