From b14cbb5d308be17dfa6e75bec72a930a829a989a Mon Sep 17 00:00:00 2001 From: Peace Date: Mon, 7 Oct 2024 16:16:03 +0900 Subject: [PATCH] add registratoin --- .../Components/Pages/Account/Login.razor | 9 +- .../Pages/Account/Registration.razor | 66 ++++ PeacePDS/PeacePDS/Data/AppDbContext.cs | 6 +- .../20241007070709_InitialCreate.Designer.cs | 312 +++++++++++++++++ .../20241007070709_InitialCreate.cs | 240 +++++++++++++ .../20241007071344_fix-createdat.Designer.cs | 315 ++++++++++++++++++ .../20241007071344_fix-createdat.cs | 30 ++ .../Migrations/AppDbContextModelSnapshot.cs | 312 +++++++++++++++++ .../PeacePDS/Models/Entities/Affirmation.cs | 5 + .../PeacePDS/Models/Entities/DailyEntry.cs | 22 ++ .../PeacePDS/Models/Entities/DailyTask.cs | 22 ++ .../PeacePDS/Models/Entities/HabitCheck.cs | 18 + .../PeacePDS/Models/Entities/HabitTracker.cs | 21 ++ PeacePDS/PeacePDS/Models/Entities/User.cs | 16 +- .../PeacePDS/Models/Entities/UserPolicy.cs | 4 + PeacePDS/PeacePDS/PeacePDS.csproj | 1 + .../PeacePDS/Responses/CustomResponses.cs | 2 +- PeacePDS/PeacePDS/Services/UserService.cs | 27 +- PeacePDS/PeacePDS/Utils/PasswordHasher.cs | 15 + .../PeacePDS/appsettings.Development.json | 3 + PeacePDS/PeacePDS/appsettings.json | 2 +- 21 files changed, 1432 insertions(+), 16 deletions(-) create mode 100644 PeacePDS/PeacePDS/Components/Pages/Account/Registration.razor create mode 100644 PeacePDS/PeacePDS/Migrations/20241007070709_InitialCreate.Designer.cs create mode 100644 PeacePDS/PeacePDS/Migrations/20241007070709_InitialCreate.cs create mode 100644 PeacePDS/PeacePDS/Migrations/20241007071344_fix-createdat.Designer.cs create mode 100644 PeacePDS/PeacePDS/Migrations/20241007071344_fix-createdat.cs create mode 100644 PeacePDS/PeacePDS/Migrations/AppDbContextModelSnapshot.cs create mode 100644 PeacePDS/PeacePDS/Models/Entities/DailyEntry.cs create mode 100644 PeacePDS/PeacePDS/Models/Entities/DailyTask.cs create mode 100644 PeacePDS/PeacePDS/Models/Entities/HabitCheck.cs create mode 100644 PeacePDS/PeacePDS/Models/Entities/HabitTracker.cs create mode 100644 PeacePDS/PeacePDS/Utils/PasswordHasher.cs diff --git a/PeacePDS/PeacePDS/Components/Pages/Account/Login.razor b/PeacePDS/PeacePDS/Components/Pages/Account/Login.razor index cd0c0e2..b91f51a 100644 --- a/PeacePDS/PeacePDS/Components/Pages/Account/Login.razor +++ b/PeacePDS/PeacePDS/Components/Pages/Account/Login.razor @@ -15,11 +15,11 @@ - + - +

LOGIN

@@ -34,6 +34,7 @@
@errorMessage?.ToString() Login + Join
@@ -60,10 +61,10 @@ var claims = new List { - new Claim(ClaimTypes.Name, loginResponse.user.Name), + new Claim(ClaimTypes.Name, loginResponse.User.Name), }; - foreach (var policy in loginResponse.policies) + foreach (var policy in loginResponse.User.UserPolicies) claims.Add(new Claim(policy.Policy, "true")); var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); diff --git a/PeacePDS/PeacePDS/Components/Pages/Account/Registration.razor b/PeacePDS/PeacePDS/Components/Pages/Account/Registration.razor new file mode 100644 index 0000000..ced4b5a --- /dev/null +++ b/PeacePDS/PeacePDS/Components/Pages/Account/Registration.razor @@ -0,0 +1,66 @@ +@page "/registration" +@using System.Security.Claims +@using PeacePDS.Models.ViewModels +@using PeacePDS.Services +@using Microsoft.AspNetCore.Authentication +@using Microsoft.AspNetCore.Authentication.Cookies +@using Microsoft.EntityFrameworkCore +@inject IUserService UserService +@inject NavigationManager NavManager + + + + + + + + + +
+ +

registration

+
+
+ + +
+
+ + +
+
+ + +
+ @errorMessage?.ToString() + Join +
+
+
+
+ +@code { + [CascadingParameter] + public HttpContext? HttpContext { get; set; } + + [SupplyParameterFromForm] + public RegisterViewModel Model { get; set; } = new(); + + private string? errorMessage; + + private async Task Authenticate() + { + RegistrationResponse registrationResponse = await UserService.RegisterAsync(Model); + if (!registrationResponse.Success) + { + errorMessage = registrationResponse.Message; + return; + } + + NavManager.NavigateTo("/login"); + } +} diff --git a/PeacePDS/PeacePDS/Data/AppDbContext.cs b/PeacePDS/PeacePDS/Data/AppDbContext.cs index 55c4364..25db710 100644 --- a/PeacePDS/PeacePDS/Data/AppDbContext.cs +++ b/PeacePDS/PeacePDS/Data/AppDbContext.cs @@ -12,6 +12,10 @@ namespace PeacePDS.Data public DbSet Users { get; set; } public DbSet UserPolicies { get; set; } - public DbSet Products { get; set; } + public DbSet Affirmations { get; set; } + public DbSet HabitTrackers { get; set; } + public DbSet HabitChecks { get; set; } + public DbSet DailyTasks { get; set; } + public DbSet DailyEntries { get; set; } } } diff --git a/PeacePDS/PeacePDS/Migrations/20241007070709_InitialCreate.Designer.cs b/PeacePDS/PeacePDS/Migrations/20241007070709_InitialCreate.Designer.cs new file mode 100644 index 0000000..b33bd66 --- /dev/null +++ b/PeacePDS/PeacePDS/Migrations/20241007070709_InitialCreate.Designer.cs @@ -0,0 +1,312 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PeacePDS.Data; + +#nullable disable + +namespace PeacePDS.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20241007070709_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("PeacePDS.Models.Entities.Affirmation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("AffirmationWord") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Month") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Affirmations"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Compliment") + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("EntryDate") + .HasColumnType("datetime(6)"); + + b.Property("Gratitude") + .HasColumnType("longtext"); + + b.Property("Journal") + .HasColumnType("longtext"); + + b.Property("Reflection") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("DailyEntries"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("IsCompleted") + .HasColumnType("tinyint(1)"); + + b.Property("TaskName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("DailyTasks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitCheck", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CheckDate") + .HasColumnType("datetime(6)"); + + b.Property("HabitTrackerId") + .HasColumnType("int"); + + b.Property("IsCompleted") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.HasIndex("HabitTrackerId"); + + b.ToTable("HabitChecks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("HabitName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Month") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("HabitTrackers"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("HashedPassword") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.UserPolicy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("IsEnable") + .HasColumnType("tinyint(1)"); + + b.Property("Policy") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserPolicies"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.Affirmation", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("Affirmations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyEntry", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("DailyEntries") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyTask", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("DailyTasks") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitCheck", b => + { + b.HasOne("PeacePDS.Models.Entities.HabitTracker", "HabitTracker") + .WithMany("HabitChecks") + .HasForeignKey("HabitTrackerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("HabitTracker"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("HabitTrackers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.UserPolicy", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("UserPolicies") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.Navigation("HabitChecks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.User", b => + { + b.Navigation("Affirmations"); + + b.Navigation("DailyEntries"); + + b.Navigation("DailyTasks"); + + b.Navigation("HabitTrackers"); + + b.Navigation("UserPolicies"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PeacePDS/PeacePDS/Migrations/20241007070709_InitialCreate.cs b/PeacePDS/PeacePDS/Migrations/20241007070709_InitialCreate.cs new file mode 100644 index 0000000..536c59c --- /dev/null +++ b/PeacePDS/PeacePDS/Migrations/20241007070709_InitialCreate.cs @@ -0,0 +1,240 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace PeacePDS.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + Name = table.Column(type: "varchar(100)", maxLength: 100, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + HashedPassword = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CreatedAt = table.Column(type: "datetime(6)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "Affirmations", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserId = table.Column(type: "int", nullable: false), + Month = table.Column(type: "datetime(6)", nullable: false), + AffirmationWord = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CreatedAt = table.Column(type: "datetime(6)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Affirmations", x => x.Id); + table.ForeignKey( + name: "FK_Affirmations_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "DailyEntries", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserId = table.Column(type: "int", nullable: false), + EntryDate = table.Column(type: "datetime(6)", nullable: false), + Compliment = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Reflection = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Gratitude = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Journal = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + CreatedAt = table.Column(type: "datetime(6)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_DailyEntries", x => x.Id); + table.ForeignKey( + name: "FK_DailyEntries_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "DailyTasks", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserId = table.Column(type: "int", nullable: false), + Date = table.Column(type: "datetime(6)", nullable: false), + TaskName = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + IsCompleted = table.Column(type: "tinyint(1)", nullable: false), + CreatedAt = table.Column(type: "datetime(6)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_DailyTasks", x => x.Id); + table.ForeignKey( + name: "FK_DailyTasks_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "HabitTrackers", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserId = table.Column(type: "int", nullable: false), + HabitName = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Month = table.Column(type: "datetime(6)", nullable: false), + CreatedAt = table.Column(type: "datetime(6)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_HabitTrackers", x => x.Id); + table.ForeignKey( + name: "FK_HabitTrackers_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "UserPolicies", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserId = table.Column(type: "int", nullable: false), + Policy = table.Column(type: "varchar(50)", maxLength: 50, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + IsEnable = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserPolicies", x => x.Id); + table.ForeignKey( + name: "FK_UserPolicies_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "HabitChecks", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + HabitTrackerId = table.Column(type: "int", nullable: false), + CheckDate = table.Column(type: "datetime(6)", nullable: false), + IsCompleted = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_HabitChecks", x => x.Id); + table.ForeignKey( + name: "FK_HabitChecks_HabitTrackers_HabitTrackerId", + column: x => x.HabitTrackerId, + principalTable: "HabitTrackers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_Affirmations_UserId", + table: "Affirmations", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_DailyEntries_UserId", + table: "DailyEntries", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_DailyTasks_UserId", + table: "DailyTasks", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_HabitChecks_HabitTrackerId", + table: "HabitChecks", + column: "HabitTrackerId"); + + migrationBuilder.CreateIndex( + name: "IX_HabitTrackers_UserId", + table: "HabitTrackers", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_UserPolicies_UserId", + table: "UserPolicies", + column: "UserId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Affirmations"); + + migrationBuilder.DropTable( + name: "DailyEntries"); + + migrationBuilder.DropTable( + name: "DailyTasks"); + + migrationBuilder.DropTable( + name: "HabitChecks"); + + migrationBuilder.DropTable( + name: "UserPolicies"); + + migrationBuilder.DropTable( + name: "HabitTrackers"); + + migrationBuilder.DropTable( + name: "Users"); + } + } +} diff --git a/PeacePDS/PeacePDS/Migrations/20241007071344_fix-createdat.Designer.cs b/PeacePDS/PeacePDS/Migrations/20241007071344_fix-createdat.Designer.cs new file mode 100644 index 0000000..fa08fe7 --- /dev/null +++ b/PeacePDS/PeacePDS/Migrations/20241007071344_fix-createdat.Designer.cs @@ -0,0 +1,315 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PeacePDS.Data; + +#nullable disable + +namespace PeacePDS.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20241007071344_fix-createdat")] + partial class fixcreatedat + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("PeacePDS.Models.Entities.Affirmation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("AffirmationWord") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Month") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Affirmations"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Compliment") + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("EntryDate") + .HasColumnType("datetime(6)"); + + b.Property("Gratitude") + .HasColumnType("longtext"); + + b.Property("Journal") + .HasColumnType("longtext"); + + b.Property("Reflection") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("DailyEntries"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("IsCompleted") + .HasColumnType("tinyint(1)"); + + b.Property("TaskName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("DailyTasks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitCheck", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CheckDate") + .HasColumnType("datetime(6)"); + + b.Property("HabitTrackerId") + .HasColumnType("int"); + + b.Property("IsCompleted") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.HasIndex("HabitTrackerId"); + + b.ToTable("HabitChecks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("HabitName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Month") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("HabitTrackers"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("HashedPassword") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.UserPolicy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("IsEnable") + .HasColumnType("tinyint(1)"); + + b.Property("Policy") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserPolicies"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.Affirmation", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("Affirmations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyEntry", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("DailyEntries") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyTask", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("DailyTasks") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitCheck", b => + { + b.HasOne("PeacePDS.Models.Entities.HabitTracker", "HabitTracker") + .WithMany("HabitChecks") + .HasForeignKey("HabitTrackerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("HabitTracker"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("HabitTrackers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.UserPolicy", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("UserPolicies") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.Navigation("HabitChecks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.User", b => + { + b.Navigation("Affirmations"); + + b.Navigation("DailyEntries"); + + b.Navigation("DailyTasks"); + + b.Navigation("HabitTrackers"); + + b.Navigation("UserPolicies"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PeacePDS/PeacePDS/Migrations/20241007071344_fix-createdat.cs b/PeacePDS/PeacePDS/Migrations/20241007071344_fix-createdat.cs new file mode 100644 index 0000000..975c40d --- /dev/null +++ b/PeacePDS/PeacePDS/Migrations/20241007071344_fix-createdat.cs @@ -0,0 +1,30 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace PeacePDS.Migrations +{ + /// + public partial class fixcreatedat : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CreatedAt", + table: "UserPolicies", + type: "datetime(6)", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CreatedAt", + table: "UserPolicies"); + } + } +} diff --git a/PeacePDS/PeacePDS/Migrations/AppDbContextModelSnapshot.cs b/PeacePDS/PeacePDS/Migrations/AppDbContextModelSnapshot.cs new file mode 100644 index 0000000..8b66bd7 --- /dev/null +++ b/PeacePDS/PeacePDS/Migrations/AppDbContextModelSnapshot.cs @@ -0,0 +1,312 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PeacePDS.Data; + +#nullable disable + +namespace PeacePDS.Migrations +{ + [DbContext(typeof(AppDbContext))] + partial class AppDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("PeacePDS.Models.Entities.Affirmation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("AffirmationWord") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Month") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Affirmations"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Compliment") + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("EntryDate") + .HasColumnType("datetime(6)"); + + b.Property("Gratitude") + .HasColumnType("longtext"); + + b.Property("Journal") + .HasColumnType("longtext"); + + b.Property("Reflection") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("DailyEntries"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("IsCompleted") + .HasColumnType("tinyint(1)"); + + b.Property("TaskName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("DailyTasks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitCheck", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CheckDate") + .HasColumnType("datetime(6)"); + + b.Property("HabitTrackerId") + .HasColumnType("int"); + + b.Property("IsCompleted") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.HasIndex("HabitTrackerId"); + + b.ToTable("HabitChecks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("HabitName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Month") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("HabitTrackers"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("HashedPassword") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.UserPolicy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("IsEnable") + .HasColumnType("tinyint(1)"); + + b.Property("Policy") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserPolicies"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.Affirmation", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("Affirmations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyEntry", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("DailyEntries") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.DailyTask", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("DailyTasks") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitCheck", b => + { + b.HasOne("PeacePDS.Models.Entities.HabitTracker", "HabitTracker") + .WithMany("HabitChecks") + .HasForeignKey("HabitTrackerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("HabitTracker"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("HabitTrackers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.UserPolicy", b => + { + b.HasOne("PeacePDS.Models.Entities.User", "User") + .WithMany("UserPolicies") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.HabitTracker", b => + { + b.Navigation("HabitChecks"); + }); + + modelBuilder.Entity("PeacePDS.Models.Entities.User", b => + { + b.Navigation("Affirmations"); + + b.Navigation("DailyEntries"); + + b.Navigation("DailyTasks"); + + b.Navigation("HabitTrackers"); + + b.Navigation("UserPolicies"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PeacePDS/PeacePDS/Models/Entities/Affirmation.cs b/PeacePDS/PeacePDS/Models/Entities/Affirmation.cs index c7d9643..fb5acc0 100644 --- a/PeacePDS/PeacePDS/Models/Entities/Affirmation.cs +++ b/PeacePDS/PeacePDS/Models/Entities/Affirmation.cs @@ -5,11 +5,16 @@ namespace PeacePDS.Models.Entities public class Affirmation { public int Id { get; set; } + [Required] public int UserId { get; set; } + [Required] public DateTime Month { get; set; } + [Required] public string AffirmationWord { get; set; } + [Required] public DateTime CreatedAt { get; set; } = DateTime.Now; + // Navigation Props public User User { get; set; } } } \ No newline at end of file diff --git a/PeacePDS/PeacePDS/Models/Entities/DailyEntry.cs b/PeacePDS/PeacePDS/Models/Entities/DailyEntry.cs new file mode 100644 index 0000000..4d13e0f --- /dev/null +++ b/PeacePDS/PeacePDS/Models/Entities/DailyEntry.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; + +namespace PeacePDS.Models.Entities +{ + public class DailyEntry + { + public int Id { get; set; } + [Required] + public int UserId { get; set; } + [Required] + public DateTime EntryDate { get; set; } + public string? Compliment { get; set; } + public string? Reflection { get; set; } + public string? Gratitude { get; set; } + public string? Journal { get; set; } + [Required] + public DateTime CreatedAt { get; set; } = DateTime.Now; + + // Navigation Props + public User User { get; set; } + } +} \ No newline at end of file diff --git a/PeacePDS/PeacePDS/Models/Entities/DailyTask.cs b/PeacePDS/PeacePDS/Models/Entities/DailyTask.cs new file mode 100644 index 0000000..6c58d3d --- /dev/null +++ b/PeacePDS/PeacePDS/Models/Entities/DailyTask.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; + +namespace PeacePDS.Models.Entities +{ + public class DailyTask + { + public int Id { get; set; } + [Required] + public int UserId { get; set; } + [Required] + public DateTime Date { get; set; } + [Required] + public string TaskName { get; set; } + [Required] + public bool IsCompleted { get; set; } + [Required] + public DateTime CreatedAt { get; set; } = DateTime.Now; + + // Navigation Props + public User User { get; set; } + } +} \ No newline at end of file diff --git a/PeacePDS/PeacePDS/Models/Entities/HabitCheck.cs b/PeacePDS/PeacePDS/Models/Entities/HabitCheck.cs new file mode 100644 index 0000000..f73028f --- /dev/null +++ b/PeacePDS/PeacePDS/Models/Entities/HabitCheck.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; + +namespace PeacePDS.Models.Entities +{ + public class HabitCheck + { + public int Id { get; set; } + [Required] + public int HabitTrackerId { get; set; } + [Required] + public DateTime CheckDate { get; set; } + [Required] + public bool IsCompleted { get; set; } + + // Navigation Props + public HabitTracker HabitTracker { get; set; } + } +} \ No newline at end of file diff --git a/PeacePDS/PeacePDS/Models/Entities/HabitTracker.cs b/PeacePDS/PeacePDS/Models/Entities/HabitTracker.cs new file mode 100644 index 0000000..1fbeacf --- /dev/null +++ b/PeacePDS/PeacePDS/Models/Entities/HabitTracker.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; + +namespace PeacePDS.Models.Entities +{ + public class HabitTracker + { + public int Id { get; set; } + [Required] + public int UserId { get; set; } + [Required] + public string HabitName { get; set; } + [Required] + public DateTime Month { get; set; } + [Required] + public DateTime CreatedAt { get; set; } = DateTime.Now; + + // Navigation Props + public User User { get; set; } + public ICollection HabitChecks { get; set; } + } +} \ No newline at end of file diff --git a/PeacePDS/PeacePDS/Models/Entities/User.cs b/PeacePDS/PeacePDS/Models/Entities/User.cs index 7455612..ca229cf 100644 --- a/PeacePDS/PeacePDS/Models/Entities/User.cs +++ b/PeacePDS/PeacePDS/Models/Entities/User.cs @@ -6,12 +6,20 @@ namespace PeacePDS.Models.Entities { public int Id { get; set; } - [MaxLength(100)] + [Required, MaxLength(100)] public string Name { get; set; } - [MaxLength(100)] - public string Password { get; set; } + [Required, MaxLength(255)] + public string HashedPassword { get; set; } - public DateTime CreatedAt { get; set; } + [Required] + public DateTime CreatedAt { get; set; } = DateTime.Now; + + // Navigation Props + public ICollection UserPolicies { get; set; } + public ICollection Affirmations { get; set; } + public ICollection HabitTrackers { get; set; } + public ICollection DailyTasks { get; set; } + public ICollection DailyEntries { get; set; } } } diff --git a/PeacePDS/PeacePDS/Models/Entities/UserPolicy.cs b/PeacePDS/PeacePDS/Models/Entities/UserPolicy.cs index 245eae8..7a759a6 100644 --- a/PeacePDS/PeacePDS/Models/Entities/UserPolicy.cs +++ b/PeacePDS/PeacePDS/Models/Entities/UserPolicy.cs @@ -9,5 +9,9 @@ namespace PeacePDS.Models.Entities [MaxLength(50)] public string? Policy { get; set; } public bool IsEnable { get; set; } + public DateTime CreatedAt { get; set; } = DateTime.Now; + + // Navigation Props + public User User { get; set; } } } diff --git a/PeacePDS/PeacePDS/PeacePDS.csproj b/PeacePDS/PeacePDS/PeacePDS.csproj index d92de87..5f024fc 100644 --- a/PeacePDS/PeacePDS/PeacePDS.csproj +++ b/PeacePDS/PeacePDS/PeacePDS.csproj @@ -7,6 +7,7 @@ + all diff --git a/PeacePDS/PeacePDS/Responses/CustomResponses.cs b/PeacePDS/PeacePDS/Responses/CustomResponses.cs index eb9b387..dd2c667 100644 --- a/PeacePDS/PeacePDS/Responses/CustomResponses.cs +++ b/PeacePDS/PeacePDS/Responses/CustomResponses.cs @@ -5,6 +5,6 @@ namespace PeacePDS.Responses public class CustomResponses { public record RegistrationResponse(bool Success = false, string Message = null!); - public record LoginResponse(bool Success = false, string Message = null!, User user = null!, List policies = null!); + public record LoginResponse(bool Success = false, string Message = null!, User User = null!); } } diff --git a/PeacePDS/PeacePDS/Services/UserService.cs b/PeacePDS/PeacePDS/Services/UserService.cs index 686df68..d039676 100644 --- a/PeacePDS/PeacePDS/Services/UserService.cs +++ b/PeacePDS/PeacePDS/Services/UserService.cs @@ -3,6 +3,7 @@ using PeacePDS.Models.Entities; using PeacePDS.Models.ViewModels; using Microsoft.EntityFrameworkCore; using static PeacePDS.Responses.CustomResponses; +using PeacePDS.Utils; namespace PeacePDS.Services { @@ -21,17 +22,33 @@ namespace PeacePDS.Services return new LoginResponse(false, "Invalid account information"); var user = _appDbContext.Users.Where(u => u.Name == model.UserName).FirstOrDefault(); - if (user is null || user.Password != model.Password) + if (user is null || !PasswordHasher.VerifyPassword(model.Password, user.HashedPassword)) return new LoginResponse(false, "Invalid account information"); - var policies = await _appDbContext.UserPolicies.Where(p => p.UserId == user.Id && p.IsEnable).ToListAsync(); + user = _appDbContext.Users.Where(u => u.Name == model.UserName).Include(u => u.UserPolicies).FirstOrDefault(); - return new LoginResponse(true, "Success", user, policies); + return new LoginResponse(true, "Success", user); } - public Task RegisterAsync(RegisterViewModel model) + public async Task RegisterAsync(RegisterViewModel model) { - throw new NotImplementedException(); + if (string.IsNullOrWhiteSpace(model.UserName) || string.IsNullOrWhiteSpace(model.Password) || string.IsNullOrEmpty(model.ConfirmPassword) || !string.Equals(model.Password, model.ConfirmPassword)) + return new RegistrationResponse(false, "Invalid account information"); + + var user = _appDbContext.Users.Where(u => u.Name == model.UserName).FirstOrDefault(); + if (user is not null) + return new RegistrationResponse(false, "Unavailable account name"); + + User newUser = new User() + { + Name = model.UserName, + HashedPassword = PasswordHasher.HashPassword(model.Password), + }; + + _appDbContext.Users.Add(newUser); + await _appDbContext.SaveChangesAsync(); + + return new RegistrationResponse(true, "Success"); } } } diff --git a/PeacePDS/PeacePDS/Utils/PasswordHasher.cs b/PeacePDS/PeacePDS/Utils/PasswordHasher.cs new file mode 100644 index 0000000..b7ab24a --- /dev/null +++ b/PeacePDS/PeacePDS/Utils/PasswordHasher.cs @@ -0,0 +1,15 @@ +namespace PeacePDS.Utils +{ + public class PasswordHasher + { + public static string HashPassword(string password) + { + return BCrypt.Net.BCrypt.HashPassword(password); + } + + public static bool VerifyPassword(string password, string hashedPassword) + { + return BCrypt.Net.BCrypt.Verify(password, hashedPassword); + } + } +} \ No newline at end of file diff --git a/PeacePDS/PeacePDS/appsettings.Development.json b/PeacePDS/PeacePDS/appsettings.Development.json index 0c208ae..dbfb290 100644 --- a/PeacePDS/PeacePDS/appsettings.Development.json +++ b/PeacePDS/PeacePDS/appsettings.Development.json @@ -1,4 +1,7 @@ { + "ConnectionStrings": { + "DefaultConnection": "Server=peacecloud.synology.me; Port=23306; Database=WEBPDS_DEV; Uid=pds; Pwd=Pds92070983!@" + }, "Logging": { "LogLevel": { "Default": "Information", diff --git a/PeacePDS/PeacePDS/appsettings.json b/PeacePDS/PeacePDS/appsettings.json index 799d37f..d341fa5 100644 --- a/PeacePDS/PeacePDS/appsettings.json +++ b/PeacePDS/PeacePDS/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "Server=peacecloud.synology.me; Port=23306; Database=BLAZORAUTH; Uid=pds; Pwd=Pds92070983!@" + "DefaultConnection": "Server=peacecloud.synology.me; Port=23306; Database=WEBPDS; Uid=pds; Pwd=Pds92070983!@" }, "Logging": { "LogLevel": {