From 2b4cd79484c98f5fda0cff171e27571dac812562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20G=C3=B3reczny?= Date: Sun, 13 Dec 2020 19:27:28 +0100 Subject: [PATCH] SES-88 Created User register connection --- ...3175031_Username column rename.Designer.cs | 683 ++++++++++++++++++ .../20201213175031_Username column rename.cs | 251 +++++++ .../ApplicationDbContextModelSnapshot.cs | 382 +++++++++- .../SessionCompanion.Database/SeedData.cs | 6 +- .../SessionCompanion.Database/Tables/User.cs | 2 +- .../EitherType/EitherDocumentation.md | 6 +- .../Intefraces/IUserService.cs | 2 +- .../Services/UserService.cs | 4 +- .../SessionCompanion.ViewModels.xml | 12 +- .../UserViewModels/UserRegisterViewModel.cs | 19 + .../UserViewModels/UserViewModel.cs | 2 +- .../registration/registration.component.html | 6 +- .../registration/registration.component.ts | 54 +- .../components/sign-in/sign-in.component.ts | 12 +- .../ClientApp/src/services/user.service.ts | 14 + .../ClientApp/src/types/ErrorResponse.ts | 2 +- .../ClientApp/src/types/SuccessResponse.ts | 4 + .../user-viewmodels/UserRegisterViewModel.ts | 4 + .../Configurations/ExceptionMiddleware.cs | 10 +- .../Controllers/UserController.cs | 31 +- .../SessionCompanion/SessionCompanion.xml | 7 + 21 files changed, 1455 insertions(+), 58 deletions(-) create mode 100644 SessionCompanion/SessionCompanion.Database/Migrations/20201213175031_Username column rename.Designer.cs create mode 100644 SessionCompanion/SessionCompanion.Database/Migrations/20201213175031_Username column rename.cs create mode 100644 SessionCompanion/SessionCompanion.ViewModels/UserViewModels/UserRegisterViewModel.cs create mode 100644 SessionCompanion/SessionCompanion/ClientApp/src/types/SuccessResponse.ts create mode 100644 SessionCompanion/SessionCompanion/ClientApp/src/types/viewmodels/user-viewmodels/UserRegisterViewModel.ts diff --git a/SessionCompanion/SessionCompanion.Database/Migrations/20201213175031_Username column rename.Designer.cs b/SessionCompanion/SessionCompanion.Database/Migrations/20201213175031_Username column rename.Designer.cs new file mode 100644 index 0000000..a69d2da --- /dev/null +++ b/SessionCompanion/SessionCompanion.Database/Migrations/20201213175031_Username column rename.Designer.cs @@ -0,0 +1,683 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SessionCompanion.Database; + +namespace SessionCompanion.Database.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20201213175031_Username column rename")] + partial class Usernamecolumnrename + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.0"); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Alignment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.HasKey("Id"); + + b.ToTable("Alignments"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Background", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.HasKey("Id"); + + b.ToTable("Backgrounds"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Biography", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("BackgroundId") + .HasColumnType("int"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("ClassId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("RaceId") + .HasColumnType("int"); + + b.Property("Sex") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("AlignmentId"); + + b.HasIndex("BackgroundId"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.HasIndex("ClassId"); + + b.HasIndex("RaceId"); + + b.ToTable("Biographies"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Character", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Characters"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Charisma", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("CanDeception") + .HasColumnType("bit"); + + b.Property("CanIntimidation") + .HasColumnType("bit"); + + b.Property("CanPerformance") + .HasColumnType("bit"); + + b.Property("CanPersuasion") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Deception") + .HasColumnType("int"); + + b.Property("Intimidation") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("Performance") + .HasColumnType("int"); + + b.Property("Persuasion") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Charismas"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Class", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Classes"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Constitution", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Constitutions"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Dexterity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Acrobatics") + .HasColumnType("int"); + + b.Property("CanAcrobatics") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CanSleightOfHand") + .HasColumnType("bit"); + + b.Property("CanStealth") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("SleightOfHand") + .HasColumnType("int"); + + b.Property("Stealth") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Dexterities"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Intelligence", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Arcana") + .HasColumnType("int"); + + b.Property("CanArcana") + .HasColumnType("bit"); + + b.Property("CanHistory") + .HasColumnType("bit"); + + b.Property("CanInvestigation") + .HasColumnType("bit"); + + b.Property("CanNature") + .HasColumnType("bit"); + + b.Property("CanReligion") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("History") + .HasColumnType("int"); + + b.Property("Investigation") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("Nature") + .HasColumnType("int"); + + b.Property("Religion") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Intelligences"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Race", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Races"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Statistics", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("ArmorClass") + .HasColumnType("int"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("CurrentHealthPoints") + .HasColumnType("int"); + + b.Property("ExperiencePoints") + .HasColumnType("int"); + + b.Property("HealthPoints") + .HasColumnType("int"); + + b.Property("Initiative") + .HasColumnType("int"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Proficiency") + .HasColumnType("int"); + + b.Property("Speed") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Statistics"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Strength", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Athletics") + .HasColumnType("int"); + + b.Property("CanAthletics") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Strengths"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Password") + .HasColumnType("nvarchar(max)"); + + b.Property("Username") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Users"); + + b.HasData( + new + { + Id = 1, + Password = "123", + Username = "Morwiec" + }, + new + { + Id = 2, + Password = "123", + Username = "Cichoklepiec" + }, + new + { + Id = 3, + Password = "123", + Username = "Ruletka" + }); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Wisdom", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("AnimalHandling") + .HasColumnType("int"); + + b.Property("CanAnimalHandling") + .HasColumnType("bit"); + + b.Property("CanInsight") + .HasColumnType("bit"); + + b.Property("CanMedicine") + .HasColumnType("bit"); + + b.Property("CanPerception") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CanSurvival") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Insight") + .HasColumnType("int"); + + b.Property("Medicine") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("Perception") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Survival") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Wisdoms"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Biography", b => + { + b.HasOne("SessionCompanion.Database.Tables.Alignment", "Alignment") + .WithMany("Biography") + .HasForeignKey("AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SessionCompanion.Database.Tables.Background", "Background") + .WithMany("Biography") + .HasForeignKey("BackgroundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Biography") + .HasForeignKey("SessionCompanion.Database.Tables.Biography", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SessionCompanion.Database.Tables.Class", "Class") + .WithMany("Biography") + .HasForeignKey("ClassId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SessionCompanion.Database.Tables.Race", "Race") + .WithMany("Biography") + .HasForeignKey("RaceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Alignment"); + + b.Navigation("Background"); + + b.Navigation("Character"); + + b.Navigation("Class"); + + b.Navigation("Race"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Character", b => + { + b.HasOne("SessionCompanion.Database.Tables.User", "User") + .WithMany("Character") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Charisma", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Charisma") + .HasForeignKey("SessionCompanion.Database.Tables.Charisma", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Constitution", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Constitution") + .HasForeignKey("SessionCompanion.Database.Tables.Constitution", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Dexterity", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Dexterity") + .HasForeignKey("SessionCompanion.Database.Tables.Dexterity", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Intelligence", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Intelligence") + .HasForeignKey("SessionCompanion.Database.Tables.Intelligence", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Statistics", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Statistics") + .HasForeignKey("SessionCompanion.Database.Tables.Statistics", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Strength", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Strength") + .HasForeignKey("SessionCompanion.Database.Tables.Strength", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Wisdom", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Wisdom") + .HasForeignKey("SessionCompanion.Database.Tables.Wisdom", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Alignment", b => + { + b.Navigation("Biography"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Background", b => + { + b.Navigation("Biography"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Character", b => + { + b.Navigation("Biography"); + + b.Navigation("Charisma"); + + b.Navigation("Constitution"); + + b.Navigation("Dexterity"); + + b.Navigation("Intelligence"); + + b.Navigation("Statistics"); + + b.Navigation("Strength"); + + b.Navigation("Wisdom"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Class", b => + { + b.Navigation("Biography"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Race", b => + { + b.Navigation("Biography"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.User", b => + { + b.Navigation("Character"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SessionCompanion/SessionCompanion.Database/Migrations/20201213175031_Username column rename.cs b/SessionCompanion/SessionCompanion.Database/Migrations/20201213175031_Username column rename.cs new file mode 100644 index 0000000..b0ad4f5 --- /dev/null +++ b/SessionCompanion/SessionCompanion.Database/Migrations/20201213175031_Username column rename.cs @@ -0,0 +1,251 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace SessionCompanion.Database.Migrations +{ + public partial class Usernamecolumnrename : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "Nickname", + table: "Users", + newName: "Username"); + + migrationBuilder.CreateTable( + name: "Charismas", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CharacterId = table.Column(type: "int", nullable: false), + Value = table.Column(type: "int", nullable: false), + Modification = table.Column(type: "int", nullable: false), + SavingThrows = table.Column(type: "int", nullable: false), + CanSaveThrows = table.Column(type: "bit", nullable: false), + Deception = table.Column(type: "int", nullable: false), + CanDeception = table.Column(type: "bit", nullable: false), + Intimidation = table.Column(type: "int", nullable: false), + CanIntimidation = table.Column(type: "bit", nullable: false), + Performance = table.Column(type: "int", nullable: false), + CanPerformance = table.Column(type: "bit", nullable: false), + Persuasion = table.Column(type: "int", nullable: false), + CanPersuasion = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Charismas", x => x.Id); + table.ForeignKey( + name: "FK_Charismas_Characters_CharacterId", + column: x => x.CharacterId, + principalTable: "Characters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Constitutions", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CharacterId = table.Column(type: "int", nullable: false), + Value = table.Column(type: "int", nullable: false), + Modification = table.Column(type: "int", nullable: false), + SavingThrows = table.Column(type: "int", nullable: false), + CanSaveThrows = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Constitutions", x => x.Id); + table.ForeignKey( + name: "FK_Constitutions_Characters_CharacterId", + column: x => x.CharacterId, + principalTable: "Characters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Dexterities", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CharacterId = table.Column(type: "int", nullable: false), + Value = table.Column(type: "int", nullable: false), + Modification = table.Column(type: "int", nullable: false), + SavingThrows = table.Column(type: "int", nullable: false), + CanSaveThrows = table.Column(type: "bit", nullable: false), + Acrobatics = table.Column(type: "int", nullable: false), + CanAcrobatics = table.Column(type: "bit", nullable: false), + SleightOfHand = table.Column(type: "int", nullable: false), + CanSleightOfHand = table.Column(type: "bit", nullable: false), + Stealth = table.Column(type: "int", nullable: false), + CanStealth = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Dexterities", x => x.Id); + table.ForeignKey( + name: "FK_Dexterities_Characters_CharacterId", + column: x => x.CharacterId, + principalTable: "Characters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Intelligences", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CharacterId = table.Column(type: "int", nullable: false), + Value = table.Column(type: "int", nullable: false), + Modification = table.Column(type: "int", nullable: false), + SavingThrows = table.Column(type: "int", nullable: false), + CanSaveThrows = table.Column(type: "bit", nullable: false), + Arcana = table.Column(type: "int", nullable: false), + CanArcana = table.Column(type: "bit", nullable: false), + History = table.Column(type: "int", nullable: false), + CanHistory = table.Column(type: "bit", nullable: false), + Investigation = table.Column(type: "int", nullable: false), + CanInvestigation = table.Column(type: "bit", nullable: false), + Nature = table.Column(type: "int", nullable: false), + CanNature = table.Column(type: "bit", nullable: false), + Religion = table.Column(type: "int", nullable: false), + CanReligion = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Intelligences", x => x.Id); + table.ForeignKey( + name: "FK_Intelligences_Characters_CharacterId", + column: x => x.CharacterId, + principalTable: "Characters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Strengths", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CharacterId = table.Column(type: "int", nullable: false), + Value = table.Column(type: "int", nullable: false), + Modification = table.Column(type: "int", nullable: false), + SavingThrows = table.Column(type: "int", nullable: false), + CanSaveThrows = table.Column(type: "bit", nullable: false), + Athletics = table.Column(type: "int", nullable: false), + CanAthletics = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Strengths", x => x.Id); + table.ForeignKey( + name: "FK_Strengths_Characters_CharacterId", + column: x => x.CharacterId, + principalTable: "Characters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Wisdoms", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CharacterId = table.Column(type: "int", nullable: false), + Value = table.Column(type: "int", nullable: false), + Modification = table.Column(type: "int", nullable: false), + SavingThrows = table.Column(type: "int", nullable: false), + CanSaveThrows = table.Column(type: "bit", nullable: false), + AnimalHandling = table.Column(type: "int", nullable: false), + CanAnimalHandling = table.Column(type: "bit", nullable: false), + Insight = table.Column(type: "int", nullable: false), + CanInsight = table.Column(type: "bit", nullable: false), + Medicine = table.Column(type: "int", nullable: false), + CanMedicine = table.Column(type: "bit", nullable: false), + Perception = table.Column(type: "int", nullable: false), + CanPerception = table.Column(type: "bit", nullable: false), + Survival = table.Column(type: "int", nullable: false), + CanSurvival = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Wisdoms", x => x.Id); + table.ForeignKey( + name: "FK_Wisdoms_Characters_CharacterId", + column: x => x.CharacterId, + principalTable: "Characters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Charismas_CharacterId", + table: "Charismas", + column: "CharacterId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Constitutions_CharacterId", + table: "Constitutions", + column: "CharacterId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Dexterities_CharacterId", + table: "Dexterities", + column: "CharacterId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Intelligences_CharacterId", + table: "Intelligences", + column: "CharacterId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Strengths_CharacterId", + table: "Strengths", + column: "CharacterId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Wisdoms_CharacterId", + table: "Wisdoms", + column: "CharacterId", + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Charismas"); + + migrationBuilder.DropTable( + name: "Constitutions"); + + migrationBuilder.DropTable( + name: "Dexterities"); + + migrationBuilder.DropTable( + name: "Intelligences"); + + migrationBuilder.DropTable( + name: "Strengths"); + + migrationBuilder.DropTable( + name: "Wisdoms"); + + migrationBuilder.RenameColumn( + name: "Username", + table: "Users", + newName: "Nickname"); + } + } +} diff --git a/SessionCompanion/SessionCompanion.Database/Migrations/ApplicationDbContextModelSnapshot.cs b/SessionCompanion/SessionCompanion.Database/Migrations/ApplicationDbContextModelSnapshot.cs index 0b86cba..42b9523 100644 --- a/SessionCompanion/SessionCompanion.Database/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/SessionCompanion/SessionCompanion.Database/Migrations/ApplicationDbContextModelSnapshot.cs @@ -103,6 +103,60 @@ namespace SessionCompanion.Database.Migrations b.ToTable("Characters"); }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Charisma", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("CanDeception") + .HasColumnType("bit"); + + b.Property("CanIntimidation") + .HasColumnType("bit"); + + b.Property("CanPerformance") + .HasColumnType("bit"); + + b.Property("CanPersuasion") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Deception") + .HasColumnType("int"); + + b.Property("Intimidation") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("Performance") + .HasColumnType("int"); + + b.Property("Persuasion") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Charismas"); + }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Class", b => { b.Property("Id") @@ -118,6 +172,144 @@ namespace SessionCompanion.Database.Migrations b.ToTable("Classes"); }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Constitution", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Constitutions"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Dexterity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Acrobatics") + .HasColumnType("int"); + + b.Property("CanAcrobatics") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CanSleightOfHand") + .HasColumnType("bit"); + + b.Property("CanStealth") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("SleightOfHand") + .HasColumnType("int"); + + b.Property("Stealth") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Dexterities"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Intelligence", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Arcana") + .HasColumnType("int"); + + b.Property("CanArcana") + .HasColumnType("bit"); + + b.Property("CanHistory") + .HasColumnType("bit"); + + b.Property("CanInvestigation") + .HasColumnType("bit"); + + b.Property("CanNature") + .HasColumnType("bit"); + + b.Property("CanReligion") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("History") + .HasColumnType("int"); + + b.Property("Investigation") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("Nature") + .HasColumnType("int"); + + b.Property("Religion") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Intelligences"); + }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Race", b => { b.Property("Id") @@ -175,6 +367,42 @@ namespace SessionCompanion.Database.Migrations b.ToTable("Statistics"); }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Strength", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("Athletics") + .HasColumnType("int"); + + b.Property("CanAthletics") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Strengths"); + }); + modelBuilder.Entity("SessionCompanion.Database.Tables.User", b => { b.Property("Id") @@ -182,10 +410,10 @@ namespace SessionCompanion.Database.Migrations .HasColumnType("int") .UseIdentityColumn(); - b.Property("Nickname") + b.Property("Password") .HasColumnType("nvarchar(max)"); - b.Property("Password") + b.Property("Username") .HasColumnType("nvarchar(max)"); b.HasKey("Id"); @@ -196,23 +424,83 @@ namespace SessionCompanion.Database.Migrations new { Id = 1, - Nickname = "Morwiec", - Password = "123" + Password = "123", + Username = "Morwiec" }, new { Id = 2, - Nickname = "Cichoklepiec", - Password = "123" + Password = "123", + Username = "Cichoklepiec" }, new { Id = 3, - Nickname = "Ruletka", - Password = "123" + Password = "123", + Username = "Ruletka" }); }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Wisdom", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("AnimalHandling") + .HasColumnType("int"); + + b.Property("CanAnimalHandling") + .HasColumnType("bit"); + + b.Property("CanInsight") + .HasColumnType("bit"); + + b.Property("CanMedicine") + .HasColumnType("bit"); + + b.Property("CanPerception") + .HasColumnType("bit"); + + b.Property("CanSaveThrows") + .HasColumnType("bit"); + + b.Property("CanSurvival") + .HasColumnType("bit"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Insight") + .HasColumnType("int"); + + b.Property("Medicine") + .HasColumnType("int"); + + b.Property("Modification") + .HasColumnType("int"); + + b.Property("Perception") + .HasColumnType("int"); + + b.Property("SavingThrows") + .HasColumnType("int"); + + b.Property("Survival") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CharacterId") + .IsUnique(); + + b.ToTable("Wisdoms"); + }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Biography", b => { b.HasOne("SessionCompanion.Database.Tables.Alignment", "Alignment") @@ -267,6 +555,50 @@ namespace SessionCompanion.Database.Migrations b.Navigation("User"); }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Charisma", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Charisma") + .HasForeignKey("SessionCompanion.Database.Tables.Charisma", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Constitution", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Constitution") + .HasForeignKey("SessionCompanion.Database.Tables.Constitution", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Dexterity", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Dexterity") + .HasForeignKey("SessionCompanion.Database.Tables.Dexterity", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Intelligence", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Intelligence") + .HasForeignKey("SessionCompanion.Database.Tables.Intelligence", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Statistics", b => { b.HasOne("SessionCompanion.Database.Tables.Character", "Character") @@ -278,6 +610,28 @@ namespace SessionCompanion.Database.Migrations b.Navigation("Character"); }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Strength", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Strength") + .HasForeignKey("SessionCompanion.Database.Tables.Strength", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + + modelBuilder.Entity("SessionCompanion.Database.Tables.Wisdom", b => + { + b.HasOne("SessionCompanion.Database.Tables.Character", "Character") + .WithOne("Wisdom") + .HasForeignKey("SessionCompanion.Database.Tables.Wisdom", "CharacterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Character"); + }); + modelBuilder.Entity("SessionCompanion.Database.Tables.Alignment", b => { b.Navigation("Biography"); @@ -292,7 +646,19 @@ namespace SessionCompanion.Database.Migrations { b.Navigation("Biography"); + b.Navigation("Charisma"); + + b.Navigation("Constitution"); + + b.Navigation("Dexterity"); + + b.Navigation("Intelligence"); + b.Navigation("Statistics"); + + b.Navigation("Strength"); + + b.Navigation("Wisdom"); }); modelBuilder.Entity("SessionCompanion.Database.Tables.Class", b => diff --git a/SessionCompanion/SessionCompanion.Database/SeedData.cs b/SessionCompanion/SessionCompanion.Database/SeedData.cs index 40edfc4..fd0f833 100644 --- a/SessionCompanion/SessionCompanion.Database/SeedData.cs +++ b/SessionCompanion/SessionCompanion.Database/SeedData.cs @@ -17,19 +17,19 @@ namespace SessionCompanion.Database new User { Id = 1, - Nickname = "Morwiec", + Username = "Morwiec", Password = "123" }, new User { Id = 2, - Nickname = "Cichoklepiec", + Username = "Cichoklepiec", Password = "123" }, new User { Id = 3, - Nickname = "Ruletka", + Username = "Ruletka", Password = "123" } }; diff --git a/SessionCompanion/SessionCompanion.Database/Tables/User.cs b/SessionCompanion/SessionCompanion.Database/Tables/User.cs index bbebdeb..e98b3a0 100644 --- a/SessionCompanion/SessionCompanion.Database/Tables/User.cs +++ b/SessionCompanion/SessionCompanion.Database/Tables/User.cs @@ -6,7 +6,7 @@ namespace SessionCompanion.Database.Tables { public class User : BaseEntity { - public string Nickname { get; set; } + public string Username { get; set; } public string Password { get; set; } public ICollection Character { get; set; } } diff --git a/SessionCompanion/SessionCompanion.Extensions/EitherType/EitherDocumentation.md b/SessionCompanion/SessionCompanion.Extensions/EitherType/EitherDocumentation.md index dfcca7c..bcced9e 100644 --- a/SessionCompanion/SessionCompanion.Extensions/EitherType/EitherDocumentation.md +++ b/SessionCompanion/SessionCompanion.Extensions/EitherType/EitherDocumentation.md @@ -72,7 +72,7 @@ public async Task> Get(int id) ### Przypisanie nowej wartoœci Jeœli z jakiegoœpowodu bêdziemy chcieli zmieniæ wartoœæ obiektu Either, musimy dokonaæ tego w taki oto sposób: ```cs -UserViewModel user = new UserViewModel() { Id = 1, Nickname = "Testowy", Password = "Secret" }; +UserViewModel user = new UserViewModel() { Id = 1, Username = "Testowy", Password = "Secret" }; Either test = "asd"; // zmieniamy wartoœæ Either @@ -80,13 +80,13 @@ test = user; // Warto zauwa¿yæ, ¿e mo¿emy zmieniæ wartoœæ obiektu znajdujacego siê wewn¹trz // którejœ ze zmiennej o ile jest on publiczny -test.Left.Nickname = "test"; +test.Left.Username = "test"; // Jednak jeœli dokonamy tego po zmianie wartoœci obietu na inny pomimo tego, ¿e // dla kodu jest to ok, to nie zadzia³a to poprawnie, poniewa¿ wartoœæ starego obiektu // jest zmieniana na null(dla boola na false) test = "asd"; -test.Left.Nickname = "b³¹d"; +test.Left.Username = "b³¹d"; ``` diff --git a/SessionCompanion/SessionCompanion.Services/Intefraces/IUserService.cs b/SessionCompanion/SessionCompanion.Services/Intefraces/IUserService.cs index a6e1006..da878b4 100644 --- a/SessionCompanion/SessionCompanion.Services/Intefraces/IUserService.cs +++ b/SessionCompanion/SessionCompanion.Services/Intefraces/IUserService.cs @@ -10,6 +10,6 @@ namespace SessionCompanion.Services.Interfaces { public interface IUserService : IServiceBase { - Task SearchUserByNickname(string userName); + Task SearchUserByUsername(string userName); } } diff --git a/SessionCompanion/SessionCompanion.Services/Services/UserService.cs b/SessionCompanion/SessionCompanion.Services/Services/UserService.cs index d60b7e1..011e2ba 100644 --- a/SessionCompanion/SessionCompanion.Services/Services/UserService.cs +++ b/SessionCompanion/SessionCompanion.Services/Services/UserService.cs @@ -18,9 +18,9 @@ namespace SessionCompanion.Services.Services public UserService(IMapper mapper, IRepository repository) : base(mapper, repository) { } - public async Task SearchUserByNickname(string userName) + public async Task SearchUserByUsername(string userName) { - var User = await Repository.Get(u => u.Nickname.Equals(userName)).FirstOrDefaultAsync(); + var User = await Repository.Get(u => u.Username.Equals(userName)).FirstOrDefaultAsync(); return Mapper.Map(User); } } diff --git a/SessionCompanion/SessionCompanion.ViewModels/SessionCompanion.ViewModels.xml b/SessionCompanion/SessionCompanion.ViewModels/SessionCompanion.ViewModels.xml index 6ff6f0c..71e048b 100644 --- a/SessionCompanion/SessionCompanion.ViewModels/SessionCompanion.ViewModels.xml +++ b/SessionCompanion/SessionCompanion.ViewModels/SessionCompanion.ViewModels.xml @@ -485,12 +485,22 @@ Czy postać posiada biegÅ‚ość w atletyce + + + Nazwa użytkowika + + + + + HasÅ‚o użytkownika + + Identyfikator użytkownika - + Nazwa użytkowika diff --git a/SessionCompanion/SessionCompanion.ViewModels/UserViewModels/UserRegisterViewModel.cs b/SessionCompanion/SessionCompanion.ViewModels/UserViewModels/UserRegisterViewModel.cs new file mode 100644 index 0000000..599db51 --- /dev/null +++ b/SessionCompanion/SessionCompanion.ViewModels/UserViewModels/UserRegisterViewModel.cs @@ -0,0 +1,19 @@ +namespace SessionCompanion.ViewModels.UserViewModels +{ + using System.ComponentModel.DataAnnotations; + + public class UserRegisterViewModel + { + /// + /// Nazwa użytkowika + /// + [Required] + public string Username { get; set; } + + /// + /// HasÅ‚o użytkownika + /// + [Required] + public string Password { get; set; } + } +} diff --git a/SessionCompanion/SessionCompanion.ViewModels/UserViewModels/UserViewModel.cs b/SessionCompanion/SessionCompanion.ViewModels/UserViewModels/UserViewModel.cs index 65a3087..66b5dd7 100644 --- a/SessionCompanion/SessionCompanion.ViewModels/UserViewModels/UserViewModel.cs +++ b/SessionCompanion/SessionCompanion.ViewModels/UserViewModels/UserViewModel.cs @@ -10,7 +10,7 @@ /// /// Nazwa użytkowika /// - public string Nickname { get; set; } + public string Username { get; set; } /// /// HasÅ‚o użytkownika diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.html b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.html index 4c1caa0..c9837d9 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.html +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.html @@ -48,10 +48,14 @@ + + {{apiErrorMessage}} + + diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.ts index 160fd2c..5532c93 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.ts @@ -1,16 +1,24 @@ -import { Component } from '@angular/core'; +import {Component, OnDestroy} from '@angular/core'; import { FormGroup, ValidationErrors, ValidatorFn, Validators, FormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; +import {UserService} from '../../../services/user.service'; +import {Subscription} from 'rxjs'; +import {ErrorResponse} from '../../../types/ErrorResponse'; +import {UserRegisterViewModel} from '../../../types/viewmodels/user-viewmodels/UserRegisterViewModel'; +import {HttpErrorResponse} from '@angular/common/http'; +import {type} from 'os'; @Component({ selector: 'app-registration', templateUrl: './registration.component.html', styleUrls: ['./registration.component.css'] }) -export class RegistrationComponent { - constructor(private router: Router, private formBuilder: FormBuilder) {} +export class RegistrationComponent implements OnDestroy { + allSubscriptions = new Subscription(); + constructor(private router: Router, private formBuilder: FormBuilder, private userService: UserService) {} - isExpanded = false; + apiError = false; + apiErrorMessage = ''; public signUpFormGroup: FormGroup = this.formBuilder.group({ newAccount: this.formBuilder.group({ @@ -23,22 +31,42 @@ export class RegistrationComponent { }) }); - collapse() { - this.isExpanded = false; - } - GoToLoginPage() { - this.router.navigate(['login']) + this.router.navigate(['login']); } - toggle() { - this.isExpanded = !this.isExpanded; + Register() { + const userRegisterModel = new class implements UserRegisterViewModel { + password: string; + username: string; + }; + + userRegisterModel.username = this.signUpFormGroup.get('newAccount').value['username']; + userRegisterModel.password = this.signUpFormGroup.get('newAccount').value['password']; + + this.allSubscriptions.add( + this.userService.registerUser(userRegisterModel).subscribe( + () => { + this.router.navigate(['login']); + }, + (error: ErrorResponse | HttpErrorResponse) => { + if (error instanceof HttpErrorResponse) { + error = error.error as ErrorResponse; + } + this.apiError = true; + this.apiErrorMessage = error.message; + } + )); + } + + ngOnDestroy() { + this.allSubscriptions.unsubscribe(); } } export const passwordMatchValidator: ValidatorFn = (formGroup: FormGroup): ValidationErrors | null => { const parent = formGroup.parent as FormGroup; - if (!parent) return null; + if (!parent) { return null; } return parent.get('password').value === parent.get('confirmPassword').value ? null : { 'mismatch': true }; -} \ No newline at end of file +}; diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.ts index aba66e0..9961b76 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.ts @@ -4,6 +4,7 @@ import { Router } from '@angular/router'; import {UserService} from '../../../services/user.service'; import {ErrorResponse} from '../../../types/ErrorResponse'; import {Subscription} from 'rxjs'; +import {HttpErrorResponse} from '@angular/common/http'; @Component({ selector: 'app-sign-in', @@ -36,10 +37,13 @@ export class SignInComponent implements OnDestroy { (success) => { this.router.navigate(['player']); }, - (error: ErrorResponse) => { - this.apiError = true; - this.apiErrorMessage = error.message; - } + (error: ErrorResponse | HttpErrorResponse) => { + if (error instanceof HttpErrorResponse) { + error = error.error as ErrorResponse; + } + this.apiError = true; + this.apiErrorMessage = error.message; + } )); } diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/services/user.service.ts b/SessionCompanion/SessionCompanion/ClientApp/src/services/user.service.ts index fda8c51..6cac49f 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/services/user.service.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/services/user.service.ts @@ -4,6 +4,8 @@ import {Observable, of, throwError} from 'rxjs'; import {ErrorResponse} from '../types/ErrorResponse'; import {Either} from '../types/Either'; import {switchMap} from 'rxjs/operators'; +import {SuccessResponse} from '../types/SuccessResponse'; +import {UserRegisterViewModel} from '../types/viewmodels/user-viewmodels/UserRegisterViewModel'; Injectable({ providedIn: 'root' @@ -28,4 +30,16 @@ export class UserService { }) ); } + + registerUser(userRegisterModel: UserRegisterViewModel): Observable { + return this.http.post>(this.baseUrl + 'register', userRegisterModel).pipe( + switchMap(response => { + if (response.isLeft) { + return of(response.left); + } else { + return throwError(response.right); + } + }) + ); + } } diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/types/ErrorResponse.ts b/SessionCompanion/SessionCompanion/ClientApp/src/types/ErrorResponse.ts index c85a9e8..810f10b 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/types/ErrorResponse.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/types/ErrorResponse.ts @@ -1,4 +1,4 @@ export interface ErrorResponse { - code: number; + statusCode: number; message: string; } diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/types/SuccessResponse.ts b/SessionCompanion/SessionCompanion/ClientApp/src/types/SuccessResponse.ts new file mode 100644 index 0000000..2ac62c3 --- /dev/null +++ b/SessionCompanion/SessionCompanion/ClientApp/src/types/SuccessResponse.ts @@ -0,0 +1,4 @@ +export interface SuccessResponse { + code: number; + message: string; +} diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/types/viewmodels/user-viewmodels/UserRegisterViewModel.ts b/SessionCompanion/SessionCompanion/ClientApp/src/types/viewmodels/user-viewmodels/UserRegisterViewModel.ts new file mode 100644 index 0000000..d2cf55e --- /dev/null +++ b/SessionCompanion/SessionCompanion/ClientApp/src/types/viewmodels/user-viewmodels/UserRegisterViewModel.ts @@ -0,0 +1,4 @@ +export interface UserRegisterViewModel { + username: string; + password: string; +} diff --git a/SessionCompanion/SessionCompanion/Configurations/ExceptionMiddleware.cs b/SessionCompanion/SessionCompanion/Configurations/ExceptionMiddleware.cs index b7b37bf..a99a2c8 100644 --- a/SessionCompanion/SessionCompanion/Configurations/ExceptionMiddleware.cs +++ b/SessionCompanion/SessionCompanion/Configurations/ExceptionMiddleware.cs @@ -34,11 +34,11 @@ namespace SessionCompanion.Configurations { context.Response.ContentType = "application/json"; context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - return context.Response.WriteAsync(new ErrorResponse() - { - StatusCode = context.Response.StatusCode, - Message = exception.Message - }.ToString()); + + string response = "{\"statusCode\":" + context.Response.StatusCode + ",\"message\":\"" + exception.Message + + "\"}"; + + return context.Response.WriteAsync(response); } } } diff --git a/SessionCompanion/SessionCompanion/Controllers/UserController.cs b/SessionCompanion/SessionCompanion/Controllers/UserController.cs index 5a17747..3272412 100644 --- a/SessionCompanion/SessionCompanion/Controllers/UserController.cs +++ b/SessionCompanion/SessionCompanion/Controllers/UserController.cs @@ -2,11 +2,11 @@ using SessionCompanion.Services.Interfaces; using SessionCompanion.ViewModels.UserViewModels; using System.Threading.Tasks; -using SessionCompanion.Extensions.EitherType; -using SessionCompanion.ViewModels.ApiResponses; namespace SessionCompanion.Controllers { + using System; + using SessionCompanion.Extensions.EitherType; using SessionCompanion.ViewModels.ApiResponses; using SessionCompanion.ViewModels.UserViewModels; @@ -31,7 +31,7 @@ namespace SessionCompanion.Controllers [HttpGet("login")] public async Task> Login(string userName, string password) { - UserViewModel user = await _service.SearchUserByNickname(userName); + UserViewModel user = await _service.SearchUserByUsername(userName); if (user != null && user.Password.Equals(password)) { @@ -49,24 +49,27 @@ namespace SessionCompanion.Controllers /// /// Metoda rejestruje podanego użytkownika /// - /// Model uzytkownika do zarejestrowania + /// Model uzytkownika do zarejestrowania /// SuccessResponse/ErrorResponse [HttpPost("register")] - public async Task> Register(UserViewModel model) + public async Task> Register(UserRegisterViewModel userRegisterModel) { - if(!ModelState.IsValid) - return new ErrorResponse() - { - StatusCode = 400, - Message = "Given model is incorect" - }; - - await _service.Create(model); + if (!ModelState.IsValid) + { + return new ErrorResponse() { StatusCode = 400, Message = "Given model is incorect" }; + } + + UserViewModel userModel = new UserViewModel() + { + Password = userRegisterModel.Password, + Username = userRegisterModel.Username + }; + + await _service.Create(userModel); await _service.SaveAsync(); return new SuccessResponse("User created"); } - } } \ No newline at end of file diff --git a/SessionCompanion/SessionCompanion/SessionCompanion.xml b/SessionCompanion/SessionCompanion/SessionCompanion.xml index 52d4274..a0e2259 100644 --- a/SessionCompanion/SessionCompanion/SessionCompanion.xml +++ b/SessionCompanion/SessionCompanion/SessionCompanion.xml @@ -19,6 +19,13 @@ HasÅ‚o Id użytkownika lub wiadomość bÅ‚Ä™du + + + Metoda rejestruje podanego użytkownika + + Model uzytkownika do zarejestrowania + SuccessResponse/ErrorResponse + Lista zalogowanych graczy i identyfikator wybranej postaci