diff --git a/src/WorkFlowCheck.BL/Services/UserService.cs b/src/WorkFlowCheck.BL/Services/UserService.cs index 0a9c286..25b4ed3 100644 --- a/src/WorkFlowCheck.BL/Services/UserService.cs +++ b/src/WorkFlowCheck.BL/Services/UserService.cs @@ -15,6 +15,7 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using WorkFlowCheck.DL.Entities; using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Identity; namespace WorkFlowCheck.BL.Services { @@ -30,6 +31,7 @@ namespace WorkFlowCheck.BL.Services _mapper = mapper; _configuration = configuration; } + public async Task GetUserAsync(int Id) { var retVal = new UserDTO() { RoleDTO = new List() }; @@ -48,7 +50,6 @@ namespace WorkFlowCheck.BL.Services } return retVal; } - public async Task> GetAllUserAsync() { var retVal = new List @@ -72,7 +73,6 @@ namespace WorkFlowCheck.BL.Services } return retVal; } - public async Task Authenticate(string userName, string password) { var retVal = new UserDTO() { RoleDTO = new List() }; @@ -113,7 +113,6 @@ namespace WorkFlowCheck.BL.Services } return retVal; } - public string GenerateJwtToken(UserDTO userDTO) { var jwtSettings = _configuration.GetSection("Jwt"); @@ -144,13 +143,74 @@ namespace WorkFlowCheck.BL.Services return new JwtSecurityTokenHandler().WriteToken(token); } + public async Task UpdateUserAsync(UserDTO userDTO) + { + var retVal = new UserDTO() { RoleDTO = new List() }; + try + { + if (userDTO.Id == 0) + { + var user = new User(); + user.UserName = userDTO.UserName; + user.FirstName = userDTO.FirstName; + user.LastName = userDTO.LastName; + user.Email = userDTO.Email; + user.JwtToken = ""; - public Task UpdateUserAsync(UserDTO userDTO) => throw new NotImplementedException(); - public Task GetRoleAsync(int Id) => throw new NotImplementedException(); - public Task> GetAllRoleAsync() => throw new NotImplementedException(); - public Task UpdateRoleAsync(RoleDTO roleDTO) => throw new NotImplementedException(); - Task IUserService.GetUserRoleAsync(int Id) => throw new NotImplementedException(); + user.PasswordHash = PasswordHasher.HashPassword(userDTO.Password); + + + _dbContext.Users.Add(user); + await _dbContext.SaveChangesAsync(); + + retVal = _mapper.Map(user); + } + else + { + var user = await _dbContext.Users.Where(w => w.Id == userDTO.Id).FirstOrDefaultAsync(); + + if (user != null) + { + user.UserName = userDTO.UserName; + user.FirstName = userDTO.FirstName; + user.LastName = userDTO.LastName; + user.Email = userDTO.Email; + await _dbContext.SaveChangesAsync(); + + retVal = _mapper.Map(user); + } + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + + return retVal; + } + + public async Task GetRoleAsync(int Id) => throw new NotImplementedException(); + public async Task> GetAllRoleAsync() + { + var retVal = new List(); + try + { + var roles = await _dbContext.Roles.ToListAsync(); + if (roles != null) + { + retVal = _mapper.Map>(roles); + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + return retVal; + } + public async Task UpdateRoleAsync(RoleDTO roleDTO) => throw new NotImplementedException(); + public async Task GetUserRoleAsync(int Id) => throw new NotImplementedException(); public Task> GetAllUserRoleAsync() => throw new NotImplementedException(); public Task UpdateUserRoleAsync(RoleDTO roleDTO) => throw new NotImplementedException(); + } } diff --git a/src/WorkFlowCheck.DL/AppDbContext.cs b/src/WorkFlowCheck.DL/AppDbContext.cs index 69bf86c..f827d0b 100644 --- a/src/WorkFlowCheck.DL/AppDbContext.cs +++ b/src/WorkFlowCheck.DL/AppDbContext.cs @@ -108,7 +108,7 @@ namespace WorkFlowCheck.DL foreach (var entry in modifiedEntries) { ((IAuditableEntity)entry.Entity).LastModAt = utcNow; - ((IAuditableEntity)entry.Entity).LastModBy = _requestContext.CurrentUsername ?? "Admin" ; + ((IAuditableEntity)entry.Entity).LastModBy = _requestContext.CurrentUsername ?? "Admin"; } } private void UpdateDeletedEntries(IEnumerable deletedEntries) @@ -136,7 +136,9 @@ namespace WorkFlowCheck.DL CreatedBy = "System", LastModAt = DateTime.UtcNow, LastModBy = "System", - JwtToken = "" + JwtToken = "", + Active = true, + Token2FA = "" }, new User { @@ -151,7 +153,9 @@ namespace WorkFlowCheck.DL CreatedBy = "System", LastModAt = DateTime.UtcNow, LastModBy = "System", - JwtToken = "" + JwtToken = "", + Active = true, + Token2FA = "" } ); } diff --git a/src/WorkFlowCheck.DL/Entities/User.cs b/src/WorkFlowCheck.DL/Entities/User.cs index 656872c..a474e90 100644 --- a/src/WorkFlowCheck.DL/Entities/User.cs +++ b/src/WorkFlowCheck.DL/Entities/User.cs @@ -12,6 +12,8 @@ namespace WorkFlowCheck.DL.Entities public string UserName { get; set; } = null!; public string? PasswordHash { get; set; } = null; public string JwtToken { get; set; } = null!; + public string Token2FA { get; set; } = null!; + public bool Active { get; set; } public virtual ICollection UserRoles { get; set; } = new List(); diff --git a/src/WorkFlowCheck.DL/Migrations/20250318104815_Extend004.Designer.cs b/src/WorkFlowCheck.DL/Migrations/20250318104815_Extend004.Designer.cs new file mode 100644 index 0000000..a9905fe --- /dev/null +++ b/src/WorkFlowCheck.DL/Migrations/20250318104815_Extend004.Designer.cs @@ -0,0 +1,635 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using WorkFlowCheck.DL; + +#nullable disable + +namespace WorkFlowCheck.DL.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20250318104815_Extend004")] + partial class Extend004 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListHeader", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CheckListTemplateHeaderId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DocumentNumber") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("GuidNumber") + .HasColumnType("uniqueidentifier"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsStorno") + .HasColumnType("bit"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("CheckListTemplateHeaderId"); + + b.ToTable("CheckListHeader", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListRow", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Answer") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("CheckListHeaderId") + .HasColumnType("int"); + + b.Property("CheckListTemplateRowId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("GuidNumber") + .HasColumnType("uniqueidentifier"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Photo") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.HasKey("Id"); + + b.HasIndex("CheckListHeaderId"); + + b.HasIndex("CheckListTemplateRowId"); + + b.ToTable("CheckListRow", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListTemplateHeader", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CheckListTemplateHeader", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListTemplateRow", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AnswerType") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("CheckListTemplateHeaderId") + .HasColumnType("int"); + + b.Property("CheckPointId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EquipmentId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OperationDescription") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RowIndex") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CheckListTemplateHeaderId"); + + b.HasIndex("CheckPointId"); + + b.HasIndex("EquipmentId"); + + b.ToTable("CheckListTemplateRow", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckPoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CheckPoint", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.Equipment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EquipmentNumber") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Equipment", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FullName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Location", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RoleName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Roles", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.RoleCheckListTemplateHeader", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CheckListTemplateHeaderId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("RoleId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CheckListTemplateHeaderId"); + + b.HasIndex("RoleId"); + + b.ToTable("RoleCheckListTemplateHeader", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Active") + .HasColumnType("bit"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("JwtToken") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LastModAt") + .HasColumnType("datetime2"); + + b.Property("LastModBy") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("Token2FA") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Users", (string)null); + + b.HasData( + new + { + Id = 1, + Active = true, + CreatedAt = new DateTime(2025, 3, 18, 10, 48, 13, 634, DateTimeKind.Utc).AddTicks(7867), + CreatedBy = "System", + Email = "admin@nuvolar.hu", + FirstName = "Administrator", + IsDeleted = false, + JwtToken = "", + LastModAt = new DateTime(2025, 3, 18, 10, 48, 13, 634, DateTimeKind.Utc).AddTicks(7870), + LastModBy = "System", + LastName = "System", + PasswordHash = "eGM0NUREZnJ0ISFFRDIxMKE5TYwthDBuUsTUEO1fBnCR3VdSCmdz47ue0RoVvnkY", + Token2FA = "", + UserName = "admin" + }, + new + { + Id = 2, + Active = true, + CreatedAt = new DateTime(2025, 3, 18, 10, 48, 13, 645, DateTimeKind.Utc).AddTicks(9210), + CreatedBy = "System", + Email = "user@nuvolar.hu", + FirstName = "User", + IsDeleted = false, + JwtToken = "", + LastModAt = new DateTime(2025, 3, 18, 10, 48, 13, 645, DateTimeKind.Utc).AddTicks(9212), + LastModBy = "System", + LastName = "System", + PasswordHash = "eGM0NUREZnJ0ISFFRDIxMPwM2D9sQSj7zmaSBIsOGe0I9hBFwCGPVbyrYMA5EnKG", + Token2FA = "", + UserName = "user" + }); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("RoleId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.HasIndex("UserId"); + + b.ToTable("UserRoles", (string)null); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListHeader", b => + { + b.HasOne("WorkFlowCheck.DL.Entities.CheckListTemplateHeader", "CheckListTemplateHeader") + .WithMany() + .HasForeignKey("CheckListTemplateHeaderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CheckListTemplateHeader"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListRow", b => + { + b.HasOne("WorkFlowCheck.DL.Entities.CheckListHeader", "CheckListHeader") + .WithMany("CheckListRows") + .HasForeignKey("CheckListHeaderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("WorkFlowCheck.DL.Entities.CheckListTemplateRow", "CheckListTemplateRow") + .WithMany() + .HasForeignKey("CheckListTemplateRowId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CheckListHeader"); + + b.Navigation("CheckListTemplateRow"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListTemplateRow", b => + { + b.HasOne("WorkFlowCheck.DL.Entities.CheckListTemplateHeader", "CheckListTemplateHeader") + .WithMany("CheckListTemplateRows") + .HasForeignKey("CheckListTemplateHeaderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("WorkFlowCheck.DL.Entities.CheckPoint", "CheckPoint") + .WithMany("CheckListTemplateRows") + .HasForeignKey("CheckPointId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("WorkFlowCheck.DL.Entities.Equipment", "Equipment") + .WithMany() + .HasForeignKey("EquipmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CheckListTemplateHeader"); + + b.Navigation("CheckPoint"); + + b.Navigation("Equipment"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.RoleCheckListTemplateHeader", b => + { + b.HasOne("WorkFlowCheck.DL.Entities.CheckListTemplateHeader", "CheckListTemplateHeader") + .WithMany() + .HasForeignKey("CheckListTemplateHeaderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("WorkFlowCheck.DL.Entities.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CheckListTemplateHeader"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.UserRole", b => + { + b.HasOne("WorkFlowCheck.DL.Entities.Role", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId"); + + b.HasOne("WorkFlowCheck.DL.Entities.User", "User") + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListHeader", b => + { + b.Navigation("CheckListRows"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckListTemplateHeader", b => + { + b.Navigation("CheckListTemplateRows"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.CheckPoint", b => + { + b.Navigation("CheckListTemplateRows"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.Role", b => + { + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("WorkFlowCheck.DL.Entities.User", b => + { + b.Navigation("UserRoles"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/WorkFlowCheck.DL/Migrations/20250318104815_Extend004.cs b/src/WorkFlowCheck.DL/Migrations/20250318104815_Extend004.cs new file mode 100644 index 0000000..4a921bd --- /dev/null +++ b/src/WorkFlowCheck.DL/Migrations/20250318104815_Extend004.cs @@ -0,0 +1,69 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace WorkFlowCheck.DL.Migrations +{ + /// + public partial class Extend004 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Active", + table: "Users", + type: "bit", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "Token2FA", + table: "Users", + type: "nvarchar(max)", + nullable: false, + defaultValue: ""); + + migrationBuilder.UpdateData( + table: "Users", + keyColumn: "Id", + keyValue: 1, + columns: new[] { "Active", "CreatedAt", "LastModAt", "Token2FA" }, + values: new object[] { true, new DateTime(2025, 3, 18, 10, 48, 13, 634, DateTimeKind.Utc).AddTicks(7867), new DateTime(2025, 3, 18, 10, 48, 13, 634, DateTimeKind.Utc).AddTicks(7870), "" }); + + migrationBuilder.UpdateData( + table: "Users", + keyColumn: "Id", + keyValue: 2, + columns: new[] { "Active", "CreatedAt", "LastModAt", "Token2FA" }, + values: new object[] { true, new DateTime(2025, 3, 18, 10, 48, 13, 645, DateTimeKind.Utc).AddTicks(9210), new DateTime(2025, 3, 18, 10, 48, 13, 645, DateTimeKind.Utc).AddTicks(9212), "" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Active", + table: "Users"); + + migrationBuilder.DropColumn( + name: "Token2FA", + table: "Users"); + + migrationBuilder.UpdateData( + table: "Users", + keyColumn: "Id", + keyValue: 1, + columns: new[] { "CreatedAt", "LastModAt" }, + values: new object[] { new DateTime(2025, 3, 12, 8, 8, 57, 555, DateTimeKind.Utc).AddTicks(6125), new DateTime(2025, 3, 12, 8, 8, 57, 555, DateTimeKind.Utc).AddTicks(6129) }); + + migrationBuilder.UpdateData( + table: "Users", + keyColumn: "Id", + keyValue: 2, + columns: new[] { "CreatedAt", "LastModAt" }, + values: new object[] { new DateTime(2025, 3, 12, 8, 8, 57, 566, DateTimeKind.Utc).AddTicks(6128), new DateTime(2025, 3, 12, 8, 8, 57, 566, DateTimeKind.Utc).AddTicks(6129) }); + } + } +} diff --git a/src/WorkFlowCheck.DL/Migrations/AppDbContextModelSnapshot.cs b/src/WorkFlowCheck.DL/Migrations/AppDbContextModelSnapshot.cs index 7988c34..f2803dd 100644 --- a/src/WorkFlowCheck.DL/Migrations/AppDbContextModelSnapshot.cs +++ b/src/WorkFlowCheck.DL/Migrations/AppDbContextModelSnapshot.cs @@ -398,6 +398,9 @@ namespace WorkFlowCheck.DL.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + b.Property("Active") + .HasColumnType("bit"); + b.Property("CreatedAt") .HasColumnType("datetime2"); @@ -434,6 +437,10 @@ namespace WorkFlowCheck.DL.Migrations b.Property("PasswordHash") .HasColumnType("nvarchar(max)"); + b.Property("Token2FA") + .IsRequired() + .HasColumnType("nvarchar(max)"); + b.Property("UserName") .IsRequired() .HasColumnType("nvarchar(max)"); @@ -446,31 +453,35 @@ namespace WorkFlowCheck.DL.Migrations new { Id = 1, - CreatedAt = new DateTime(2025, 3, 12, 8, 8, 57, 555, DateTimeKind.Utc).AddTicks(6125), + Active = true, + CreatedAt = new DateTime(2025, 3, 18, 10, 48, 13, 634, DateTimeKind.Utc).AddTicks(7867), CreatedBy = "System", Email = "admin@nuvolar.hu", FirstName = "Administrator", IsDeleted = false, JwtToken = "", - LastModAt = new DateTime(2025, 3, 12, 8, 8, 57, 555, DateTimeKind.Utc).AddTicks(6129), + LastModAt = new DateTime(2025, 3, 18, 10, 48, 13, 634, DateTimeKind.Utc).AddTicks(7870), LastModBy = "System", LastName = "System", PasswordHash = "eGM0NUREZnJ0ISFFRDIxMKE5TYwthDBuUsTUEO1fBnCR3VdSCmdz47ue0RoVvnkY", + Token2FA = "", UserName = "admin" }, new { Id = 2, - CreatedAt = new DateTime(2025, 3, 12, 8, 8, 57, 566, DateTimeKind.Utc).AddTicks(6128), + Active = true, + CreatedAt = new DateTime(2025, 3, 18, 10, 48, 13, 645, DateTimeKind.Utc).AddTicks(9210), CreatedBy = "System", Email = "user@nuvolar.hu", FirstName = "User", IsDeleted = false, JwtToken = "", - LastModAt = new DateTime(2025, 3, 12, 8, 8, 57, 566, DateTimeKind.Utc).AddTicks(6129), + LastModAt = new DateTime(2025, 3, 18, 10, 48, 13, 645, DateTimeKind.Utc).AddTicks(9212), LastModBy = "System", LastName = "System", PasswordHash = "eGM0NUREZnJ0ISFFRDIxMPwM2D9sQSj7zmaSBIsOGe0I9hBFwCGPVbyrYMA5EnKG", + Token2FA = "", UserName = "user" }); }); diff --git a/src/WorkFlowCheck.Web/Pages/Index.cshtml b/src/WorkFlowCheck.Web/Pages/Index.cshtml index f9ff8d4..53add77 100644 --- a/src/WorkFlowCheck.Web/Pages/Index.cshtml +++ b/src/WorkFlowCheck.Web/Pages/Index.cshtml @@ -5,6 +5,6 @@ }
-

Welcome

-

Learn about building Web apps with ASP.NET Core.

+

Üdvözlöm!

+

WorkFlowCheck Tablet & WEB & API rendszer.

diff --git a/src/WorkFlowCheck.Web/Pages/UserAndRole/RolePage.cshtml b/src/WorkFlowCheck.Web/Pages/UserAndRole/RolePage.cshtml index 34cc0de..2179e76 100644 --- a/src/WorkFlowCheck.Web/Pages/UserAndRole/RolePage.cshtml +++ b/src/WorkFlowCheck.Web/Pages/UserAndRole/RolePage.cshtml @@ -1,4 +1,90 @@ @page @model WorkFlowCheck.Web.Pages.UserAndRole.RolePageModel @{ + ViewData["Title"] = "Szabályok"; +} +

@ViewData["Title"]

+ +
+
+ +
+ + + + + + + + + + + + + + + +
IDRole NameAction
IDRole NameAction
+
+ +@section Scripts { + } diff --git a/src/WorkFlowCheck.Web/Pages/UserAndRole/RolePage.cshtml.cs b/src/WorkFlowCheck.Web/Pages/UserAndRole/RolePage.cshtml.cs index 0fae111..a804b29 100644 --- a/src/WorkFlowCheck.Web/Pages/UserAndRole/RolePage.cshtml.cs +++ b/src/WorkFlowCheck.Web/Pages/UserAndRole/RolePage.cshtml.cs @@ -1,12 +1,25 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using WorkFlowCheck.Web.Services.Interfaces; namespace WorkFlowCheck.Web.Pages.UserAndRole { public class RolePageModel : PageModel { + private readonly ILogger _logger; + private readonly IUserService _userService; + public RolePageModel(ILogger logger, IUserService userService) + { + _logger = logger; + _userService = userService; + } public void OnGet() { } + public async Task OnGetLoadRoles() + { + var results = await _userService.GetAllRoles(); + return new JsonResult(new { data = results }); + } } } diff --git a/src/WorkFlowCheck.Web/Pages/UserAndRole/UserEditPage.cshtml b/src/WorkFlowCheck.Web/Pages/UserAndRole/UserEditPage.cshtml index 16924b5..0e48aa6 100644 --- a/src/WorkFlowCheck.Web/Pages/UserAndRole/UserEditPage.cshtml +++ b/src/WorkFlowCheck.Web/Pages/UserAndRole/UserEditPage.cshtml @@ -15,11 +15,27 @@
+ + +
+ @if (Model.User.Id == 0) + { +
+ + + +
+ } +
+ + + +
@@ -45,6 +61,8 @@ var formData = getFormAsNestedObject('#UserForm'); const $form = $('#UserForm'); + formData.User.RoleDTO=[]; + if ($form.valid()) { $.ajax({ @@ -78,7 +96,7 @@ } }); - + $(document).ready(function () { const $form = $("#userForm"); diff --git a/src/WorkFlowCheck.Web/Pages/UserAndRole/UserEditPage.cshtml.cs b/src/WorkFlowCheck.Web/Pages/UserAndRole/UserEditPage.cshtml.cs index d881086..0ca918b 100644 --- a/src/WorkFlowCheck.Web/Pages/UserAndRole/UserEditPage.cshtml.cs +++ b/src/WorkFlowCheck.Web/Pages/UserAndRole/UserEditPage.cshtml.cs @@ -1,6 +1,8 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using Serilog; using WorkFlowCheck.Common.DTO; +using WorkFlowCheck.Web.Services; using WorkFlowCheck.Web.Services.Interfaces; namespace WorkFlowCheck.Web.Pages.UserAndRole @@ -23,5 +25,26 @@ namespace WorkFlowCheck.Web.Pages.UserAndRole { User = await _userService.GetUser(id); } + public async Task OnPostSave([FromBody] UserDTO userDTO) + { + try + { + var result = await _userService.UpdateUser(userDTO); + if (result.IsSuccess) + { + return new JsonResult(new { success = true }); + } + else + { + return new JsonResult(new { success = false }); + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + + return new JsonResult(new { success = false }); + } } } diff --git a/src/WorkFlowCheck.Web/Services/Interfaces/IUserService.cs b/src/WorkFlowCheck.Web/Services/Interfaces/IUserService.cs index 2271701..8a5bec6 100644 --- a/src/WorkFlowCheck.Web/Services/Interfaces/IUserService.cs +++ b/src/WorkFlowCheck.Web/Services/Interfaces/IUserService.cs @@ -6,16 +6,16 @@ namespace WorkFlowCheck.Web.Services.Interfaces { Task GetUser(int id); Task> GetAllUsers(); - Task UpdateUser(UserDTO user); + Task> UpdateUser(UserDTO userDTO); Task> Authenticate(string username, string password); Task GetRole(int id); Task> GetAllRoles(); - Task UpdateRole(RoleDTO role); + Task> UpdateRole(RoleDTO roleDTO); Task GetUserRole(int id); - Task> GetAllUserRoles(); - Task UpdateUserRole(UserRoleDTO userRole); + Task> GetAllUserRoles(); + Task> UpdateUserRole(UserRoleDTO userRoleDTO); } diff --git a/src/WorkFlowCheck.Web/Services/UserService.cs b/src/WorkFlowCheck.Web/Services/UserService.cs index 89ff6b7..9ebf2c8 100644 --- a/src/WorkFlowCheck.Web/Services/UserService.cs +++ b/src/WorkFlowCheck.Web/Services/UserService.cs @@ -11,6 +11,78 @@ namespace WorkFlowCheck.Web.Services public UserService(HttpClient httpClient, IConfiguration configuration, IHttpContextAccessor httpContextAccessor) : base(httpClient, configuration, httpContextAccessor) { } + + + public async Task GetUser(int id) + { + string endpoint = $"{_httpClient.BaseAddress}api/User/GetUser/{id}"; + var retVal = new UserDTO() { RoleDTO = new List() }; + try + { + var response = await _httpClient.GetFromJsonAsync>(endpoint); + if (response != null) + { + if (response.IsSuccess) + { + return response.Data; + } + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + return retVal; + } + public async Task> GetAllUsers() + { + string endpoint = $"{_httpClient.BaseAddress}api/User/GetAllUsers"; + var retVal = new List(); + try + { + var response = await _httpClient.GetFromJsonAsync>>(endpoint); + if (response != null) + { + if (response.IsSuccess) + { + return response.Data; + } + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + return retVal; + } + public async Task> UpdateUser(UserDTO userDTO) + { + try + { + string endpoint = $"{_httpClient.BaseAddress}api/user/updateUser"; + + using (HttpResponseMessage httpResponseMessage = await _httpClient.PostAsJsonAsync(endpoint, userDTO)) + { + httpResponseMessage.EnsureSuccessStatusCode(); + + var jsonString = await httpResponseMessage.Content.ReadAsStringAsync(); + var response = JsonConvert.DeserializeObject>(jsonString); + + return response ?? new ApiResponseDTO + { + IsSuccess = false, + }; + } + } + catch (Exception ex) + { + // Hiba visszaadása + return new ApiResponseDTO + { + IsSuccess = false + }; + } + } public async Task> Authenticate(string username, string password) { try @@ -49,15 +121,14 @@ namespace WorkFlowCheck.Web.Services } } - public Task>> GetAllRoles() => throw new NotImplementedException(); - public Task>> GetAllUserRoles() => throw new NotImplementedException(); - public async Task> GetAllUsers() + + public async Task GetRole(int id) { - string endpoint = $"{_httpClient.BaseAddress}api/User/GetAllUsers"; - var retVal = new List(); + string endpoint = $"{_httpClient.BaseAddress}api/Role/GetRole/{id}"; + var retVal = new RoleDTO(); try { - var response = await _httpClient.GetFromJsonAsync>>(endpoint); + var response = await _httpClient.GetFromJsonAsync>(endpoint); if (response != null) { if (response.IsSuccess) @@ -72,15 +143,64 @@ namespace WorkFlowCheck.Web.Services } return retVal; } + public async Task> GetAllRoles() + { + string endpoint = $"{_httpClient.BaseAddress}api/User/GetAllRoles"; + var retVal = new List(); + try + { + var response = await _httpClient.GetFromJsonAsync>>(endpoint); + if (response != null) + { + if (response.IsSuccess) + { + return response.Data; + } + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + return retVal; + } + public async Task> UpdateRole(RoleDTO roleDTO) + { + try + { + string endpoint = $"{_httpClient.BaseAddress}api/user/updateRole"; + + using (HttpResponseMessage httpResponseMessage = await _httpClient.PostAsJsonAsync(endpoint, roleDTO)) + { + httpResponseMessage.EnsureSuccessStatusCode(); + + var jsonString = await httpResponseMessage.Content.ReadAsStringAsync(); + var response = JsonConvert.DeserializeObject>(jsonString); + + return response ?? new ApiResponseDTO + { + IsSuccess = false, + }; + } + } + catch (Exception ex) + { + // Hiba visszaadása + return new ApiResponseDTO + { + IsSuccess = false + }; + } + } - public Task GetRole(int id) => throw new NotImplementedException(); - public async Task GetUser(int id) + + public async Task GetUserRole(int id) { - string endpoint = $"{_httpClient.BaseAddress}api/User/GetUser/{id}"; - var retVal = new UserDTO() { RoleDTO = new List() }; + string endpoint = $"{_httpClient.BaseAddress}api/UserRole/GetUserRole/{id}"; + var retVal = new UserRoleDTO(); try { - var response = await _httpClient.GetFromJsonAsync>(endpoint); + var response = await _httpClient.GetFromJsonAsync>(endpoint); if (response != null) { if (response.IsSuccess) @@ -95,11 +215,55 @@ namespace WorkFlowCheck.Web.Services } return retVal; } - public Task GetUserRole(int id) => throw new NotImplementedException(); - public Task UpdateRole(RoleDTO role) => throw new NotImplementedException(); - public Task UpdateUser(UserDTO user) => throw new NotImplementedException(); - public Task UpdateUserRole(UserRoleDTO userRole) => throw new NotImplementedException(); - Task> IUserService.GetAllRoles() => throw new NotImplementedException(); - Task> IUserService.GetAllUserRoles() => throw new NotImplementedException(); + public async Task> GetAllUserRoles() + { + string endpoint = $"{_httpClient.BaseAddress}api/User/GetAllUserRoles"; + var retVal = new List(); + try + { + var response = await _httpClient.GetFromJsonAsync>>(endpoint); + if (response != null) + { + if (response.IsSuccess) + { + return response.Data; + } + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + return retVal; + } + public async Task> UpdateUserRole(UserRoleDTO userRoleDTO) + { + try + { + string endpoint = $"{_httpClient.BaseAddress}api/user/updateUserRole"; + + using (HttpResponseMessage httpResponseMessage = await _httpClient.PostAsJsonAsync(endpoint, userRoleDTO)) + { + httpResponseMessage.EnsureSuccessStatusCode(); + + var jsonString = await httpResponseMessage.Content.ReadAsStringAsync(); + var response = JsonConvert.DeserializeObject>(jsonString); + + return response ?? new ApiResponseDTO + { + IsSuccess = false, + }; + } + } + catch (Exception ex) + { + // Hiba visszaadása + return new ApiResponseDTO + { + IsSuccess = false + }; + } + } + } }