From f35a7aecd313547a6f6478a056fb2d5593f1c07b Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sat, 15 May 2021 22:20:53 +0300 Subject: Big daddy refactor --- ExamTemplate/Common/Common.csproj | 7 - ExamTemplate/Common/ErrorMessages.cs | 12 - .../Common/ExamTemplate.Common/ErrorMessages.cs | 12 + .../ExamTemplate.Common/ExamTemplate.Common.csproj | 7 + .../Common/ExamTemplate.Common/RoleConst.cs | 17 ++ ExamTemplate/Common/RoleConst.cs | 17 -- ExamTemplate/Data/Data.csproj | 22 -- .../Data/ExamTemplate.Data.Models/BaseModel.cs | 13 + .../ExamTemplate.Data.Models.csproj | 11 + ExamTemplate/Data/ExamTemplate.Data.Models/User.cs | 13 + .../ExamTemplate.Data/ExamTemplate.Data.csproj | 23 ++ ...210506172429_ImplementedUserAndRole.Designer.cs | 306 +++++++++++++++++++++ .../20210506172429_ImplementedUserAndRole.cs | 252 +++++++++++++++++ .../Migrations/TemplateContextModelSnapshot.cs | 304 ++++++++++++++++++++ .../Data/ExamTemplate.Data/TemplateContext.cs | 23 ++ .../ExamTemplate.Data/TemplateContextFactory.cs | 24 ++ ...210506172429_ImplementedUserAndRole.Designer.cs | 306 --------------------- .../20210506172429_ImplementedUserAndRole.cs | 252 ----------------- .../Migrations/TemplateContextModelSnapshot.cs | 304 -------------------- ExamTemplate/Data/Models/BaseModel.cs | 13 - ExamTemplate/Data/Models/User.cs | 13 - ExamTemplate/Data/TemplateContext.cs | 23 -- ExamTemplate/Data/TemplateContextFactory.cs | 24 -- ExamTemplate/ExamTemplate.sln | 163 +++++++---- .../Services/Configurations/ServiceUserMappings.cs | 15 - .../BaseServiceModel.cs | 9 + .../ExamTemplate.Services.Models.csproj | 7 + .../User/LoginUserServiceModel.cs | 8 + .../User/RegisterUserServiceModel.cs | 10 + .../User/UserServiceModel.cs | 9 + .../Configurations/ServiceUserMappings.cs | 15 + .../ExamTemplate.Services.csproj | 20 ++ .../Interfaces/IBaseService.cs | 21 ++ .../Interfaces/ICloudinaryService.cs | 11 + .../Interfaces/IUserService.cs | 25 ++ .../ExamTemplate.Services/Services/BaseService.cs | 91 ++++++ .../Services/CloudinaryService.cs | 50 ++++ .../ExamTemplate.Services/Services/UserService.cs | 129 +++++++++ ExamTemplate/Services/Interfaces/IBaseService.cs | 21 -- .../Services/Interfaces/ICloudinaryService.cs | 11 - ExamTemplate/Services/Interfaces/IUserService.cs | 25 -- ExamTemplate/Services/Models/BaseServiceModel.cs | 9 - .../Services/Models/User/LoginUserServiceModel.cs | 8 - .../Models/User/RegisterUserServiceModel.cs | 10 - .../Services/Models/User/UserServiceModel.cs | 9 - ExamTemplate/Services/Services.csproj | 18 -- ExamTemplate/Services/Services/BaseService.cs | 91 ------ .../Services/Services/CloudinaryService.cs | 50 ---- ExamTemplate/Services/Services/UserService.cs | 129 --------- .../Web/Configurations/ControllerUserMappings.cs | 18 -- ExamTemplate/Web/Controllers/AccountController.cs | 146 ---------- ExamTemplate/Web/Controllers/HomeController.cs | 33 --- .../Web/ExamTemplate.Web.Models/BaseWebModel.cs | 9 + .../Web/ExamTemplate.Web.Models/ErrorViewModel.cs | 9 + .../ExamTemplate.Web.Models.csproj | 7 + .../User/EditUserWebModel.cs | 19 ++ .../User/LoginUserWebModel.cs | 15 + .../User/RegisterUserWebModel.cs | 23 ++ .../ExamTemplate.Web.Models/User/UserWebModel.cs | 9 + .../Configurations/ControllerUserMappings.cs | 18 ++ .../Controllers/AccountController.cs | 146 ++++++++++ .../ExamTemplate.Web/Controllers/HomeController.cs | 33 +++ .../Web/ExamTemplate.Web/ExamTemplate.Web.csproj | 20 ++ ExamTemplate/Web/ExamTemplate.Web/Program.cs | 20 ++ .../Properties/launchSettings.json | 27 ++ ExamTemplate/Web/ExamTemplate.Web/Startup.cs | 134 +++++++++ .../Web/ExamTemplate.Web/Views/Account/Edit.cshtml | 20 ++ .../ExamTemplate.Web/Views/Account/Login.cshtml | 23 ++ .../ExamTemplate.Web/Views/Account/Profile.cshtml | 33 +++ .../ExamTemplate.Web/Views/Account/Register.cshtml | 27 ++ .../Web/ExamTemplate.Web/Views/Home/Index.cshtml | 8 + .../Web/ExamTemplate.Web/Views/Shared/Error.cshtml | 25 ++ .../Views/Shared/ErrorNotFound.cshtml | 10 + .../Views/Shared/_FooterContent.cshtml | 8 + .../ExamTemplate.Web/Views/Shared/_Layout.cshtml | 25 ++ .../ExamTemplate.Web/Views/Shared/_Navbar.cshtml | 31 +++ .../Web/ExamTemplate.Web/Views/_ViewImports.cshtml | 5 + .../Web/ExamTemplate.Web/Views/_ViewStart.cshtml | 3 + ExamTemplate/Web/ExamTemplate.Web/appsettings.json | 18 ++ .../Web/ExamTemplate.Web/wwwroot/css/site.css | 79 ++++++ .../Web/ExamTemplate.Web/wwwroot/css/styles.css | 143 ++++++++++ .../Web/ExamTemplate.Web/wwwroot/favicon.ico | Bin 0 -> 32038 bytes ExamTemplate/Web/Models/BaseWebModel.cs | 9 - ExamTemplate/Web/Models/ErrorViewModel.cs | 9 - ExamTemplate/Web/Models/User/EditUserWebModel.cs | 19 -- ExamTemplate/Web/Models/User/LoginUserWebModel.cs | 15 - .../Web/Models/User/RegisterUserWebModel.cs | 23 -- ExamTemplate/Web/Models/User/UserWebModel.cs | 9 - ExamTemplate/Web/Program.cs | 20 -- ExamTemplate/Web/Properties/launchSettings.json | 27 -- ExamTemplate/Web/Startup.cs | 134 --------- ExamTemplate/Web/Views/Account/Edit.cshtml | 20 -- ExamTemplate/Web/Views/Account/Login.cshtml | 23 -- ExamTemplate/Web/Views/Account/Profile.cshtml | 33 --- ExamTemplate/Web/Views/Account/Register.cshtml | 27 -- ExamTemplate/Web/Views/Home/Index.cshtml | 8 - ExamTemplate/Web/Views/Shared/Error.cshtml | 25 -- ExamTemplate/Web/Views/Shared/ErrorNotFound.cshtml | 10 - .../Web/Views/Shared/_FooterContent.cshtml | 8 - ExamTemplate/Web/Views/Shared/_Layout.cshtml | 25 -- ExamTemplate/Web/Views/Shared/_Navbar.cshtml | 31 --- ExamTemplate/Web/Views/_ViewImports.cshtml | 5 - ExamTemplate/Web/Views/_ViewStart.cshtml | 3 - ExamTemplate/Web/Web.csproj | 18 -- ExamTemplate/Web/appsettings.json | 18 -- ExamTemplate/Web/wwwroot/css/site.css | 79 ------ ExamTemplate/Web/wwwroot/css/styles.css | 143 ---------- ExamTemplate/Web/wwwroot/favicon.ico | Bin 32038 -> 0 bytes 108 files changed, 2468 insertions(+), 2379 deletions(-) delete mode 100644 ExamTemplate/Common/Common.csproj delete mode 100644 ExamTemplate/Common/ErrorMessages.cs create mode 100644 ExamTemplate/Common/ExamTemplate.Common/ErrorMessages.cs create mode 100644 ExamTemplate/Common/ExamTemplate.Common/ExamTemplate.Common.csproj create mode 100644 ExamTemplate/Common/ExamTemplate.Common/RoleConst.cs delete mode 100644 ExamTemplate/Common/RoleConst.cs delete mode 100644 ExamTemplate/Data/Data.csproj create mode 100644 ExamTemplate/Data/ExamTemplate.Data.Models/BaseModel.cs create mode 100644 ExamTemplate/Data/ExamTemplate.Data.Models/ExamTemplate.Data.Models.csproj create mode 100644 ExamTemplate/Data/ExamTemplate.Data.Models/User.cs create mode 100644 ExamTemplate/Data/ExamTemplate.Data/ExamTemplate.Data.csproj create mode 100644 ExamTemplate/Data/ExamTemplate.Data/Migrations/20210506172429_ImplementedUserAndRole.Designer.cs create mode 100644 ExamTemplate/Data/ExamTemplate.Data/Migrations/20210506172429_ImplementedUserAndRole.cs create mode 100644 ExamTemplate/Data/ExamTemplate.Data/Migrations/TemplateContextModelSnapshot.cs create mode 100644 ExamTemplate/Data/ExamTemplate.Data/TemplateContext.cs create mode 100644 ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs delete mode 100644 ExamTemplate/Data/Migrations/20210506172429_ImplementedUserAndRole.Designer.cs delete mode 100644 ExamTemplate/Data/Migrations/20210506172429_ImplementedUserAndRole.cs delete mode 100644 ExamTemplate/Data/Migrations/TemplateContextModelSnapshot.cs delete mode 100644 ExamTemplate/Data/Models/BaseModel.cs delete mode 100644 ExamTemplate/Data/Models/User.cs delete mode 100644 ExamTemplate/Data/TemplateContext.cs delete mode 100644 ExamTemplate/Data/TemplateContextFactory.cs delete mode 100644 ExamTemplate/Services/Configurations/ServiceUserMappings.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/BaseServiceModel.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/ExamTemplate.Services.Models.csproj create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/User/LoginUserServiceModel.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/User/RegisterUserServiceModel.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/User/UserServiceModel.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Configurations/ServiceUserMappings.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/ExamTemplate.Services.csproj create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Interfaces/IBaseService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Interfaces/ICloudinaryService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Interfaces/IUserService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Services/BaseService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Services/CloudinaryService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Services/UserService.cs delete mode 100644 ExamTemplate/Services/Interfaces/IBaseService.cs delete mode 100644 ExamTemplate/Services/Interfaces/ICloudinaryService.cs delete mode 100644 ExamTemplate/Services/Interfaces/IUserService.cs delete mode 100644 ExamTemplate/Services/Models/BaseServiceModel.cs delete mode 100644 ExamTemplate/Services/Models/User/LoginUserServiceModel.cs delete mode 100644 ExamTemplate/Services/Models/User/RegisterUserServiceModel.cs delete mode 100644 ExamTemplate/Services/Models/User/UserServiceModel.cs delete mode 100644 ExamTemplate/Services/Services.csproj delete mode 100644 ExamTemplate/Services/Services/BaseService.cs delete mode 100644 ExamTemplate/Services/Services/CloudinaryService.cs delete mode 100644 ExamTemplate/Services/Services/UserService.cs delete mode 100644 ExamTemplate/Web/Configurations/ControllerUserMappings.cs delete mode 100644 ExamTemplate/Web/Controllers/AccountController.cs delete mode 100644 ExamTemplate/Web/Controllers/HomeController.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web.Models/BaseWebModel.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web.Models/ErrorViewModel.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web.Models/ExamTemplate.Web.Models.csproj create mode 100644 ExamTemplate/Web/ExamTemplate.Web.Models/User/EditUserWebModel.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web.Models/User/LoginUserWebModel.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web.Models/User/RegisterUserWebModel.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web.Models/User/UserWebModel.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Configurations/ControllerUserMappings.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Controllers/AccountController.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Controllers/HomeController.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web/ExamTemplate.Web.csproj create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Program.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Properties/launchSettings.json create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Startup.cs create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Account/Edit.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Account/Login.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Account/Profile.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Account/Register.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Home/Index.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Shared/Error.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Shared/ErrorNotFound.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_FooterContent.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_Layout.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_Navbar.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/_ViewImports.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/Views/_ViewStart.cshtml create mode 100644 ExamTemplate/Web/ExamTemplate.Web/appsettings.json create mode 100644 ExamTemplate/Web/ExamTemplate.Web/wwwroot/css/site.css create mode 100644 ExamTemplate/Web/ExamTemplate.Web/wwwroot/css/styles.css create mode 100644 ExamTemplate/Web/ExamTemplate.Web/wwwroot/favicon.ico delete mode 100644 ExamTemplate/Web/Models/BaseWebModel.cs delete mode 100644 ExamTemplate/Web/Models/ErrorViewModel.cs delete mode 100644 ExamTemplate/Web/Models/User/EditUserWebModel.cs delete mode 100644 ExamTemplate/Web/Models/User/LoginUserWebModel.cs delete mode 100644 ExamTemplate/Web/Models/User/RegisterUserWebModel.cs delete mode 100644 ExamTemplate/Web/Models/User/UserWebModel.cs delete mode 100644 ExamTemplate/Web/Program.cs delete mode 100644 ExamTemplate/Web/Properties/launchSettings.json delete mode 100644 ExamTemplate/Web/Startup.cs delete mode 100644 ExamTemplate/Web/Views/Account/Edit.cshtml delete mode 100644 ExamTemplate/Web/Views/Account/Login.cshtml delete mode 100644 ExamTemplate/Web/Views/Account/Profile.cshtml delete mode 100644 ExamTemplate/Web/Views/Account/Register.cshtml delete mode 100644 ExamTemplate/Web/Views/Home/Index.cshtml delete mode 100644 ExamTemplate/Web/Views/Shared/Error.cshtml delete mode 100644 ExamTemplate/Web/Views/Shared/ErrorNotFound.cshtml delete mode 100644 ExamTemplate/Web/Views/Shared/_FooterContent.cshtml delete mode 100644 ExamTemplate/Web/Views/Shared/_Layout.cshtml delete mode 100644 ExamTemplate/Web/Views/Shared/_Navbar.cshtml delete mode 100644 ExamTemplate/Web/Views/_ViewImports.cshtml delete mode 100644 ExamTemplate/Web/Views/_ViewStart.cshtml delete mode 100644 ExamTemplate/Web/Web.csproj delete mode 100644 ExamTemplate/Web/appsettings.json delete mode 100644 ExamTemplate/Web/wwwroot/css/site.css delete mode 100644 ExamTemplate/Web/wwwroot/css/styles.css delete mode 100644 ExamTemplate/Web/wwwroot/favicon.ico diff --git a/ExamTemplate/Common/Common.csproj b/ExamTemplate/Common/Common.csproj deleted file mode 100644 index 563e6f9..0000000 --- a/ExamTemplate/Common/Common.csproj +++ /dev/null @@ -1,7 +0,0 @@ - - - - net5.0 - - - diff --git a/ExamTemplate/Common/ErrorMessages.cs b/ExamTemplate/Common/ErrorMessages.cs deleted file mode 100644 index fa15b8c..0000000 --- a/ExamTemplate/Common/ErrorMessages.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace ExamTemplate.Common -{ - public static class ErrorMessages - { - public static string NullObject(Type t) - { - return String.Format("{0} cannot be null!", t); - } - } -} diff --git a/ExamTemplate/Common/ExamTemplate.Common/ErrorMessages.cs b/ExamTemplate/Common/ExamTemplate.Common/ErrorMessages.cs new file mode 100644 index 0000000..fa15b8c --- /dev/null +++ b/ExamTemplate/Common/ExamTemplate.Common/ErrorMessages.cs @@ -0,0 +1,12 @@ +using System; + +namespace ExamTemplate.Common +{ + public static class ErrorMessages + { + public static string NullObject(Type t) + { + return String.Format("{0} cannot be null!", t); + } + } +} diff --git a/ExamTemplate/Common/ExamTemplate.Common/ExamTemplate.Common.csproj b/ExamTemplate/Common/ExamTemplate.Common/ExamTemplate.Common.csproj new file mode 100644 index 0000000..563e6f9 --- /dev/null +++ b/ExamTemplate/Common/ExamTemplate.Common/ExamTemplate.Common.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/ExamTemplate/Common/ExamTemplate.Common/RoleConst.cs b/ExamTemplate/Common/ExamTemplate.Common/RoleConst.cs new file mode 100644 index 0000000..7d72fea --- /dev/null +++ b/ExamTemplate/Common/ExamTemplate.Common/RoleConst.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace ExamTemplate.Common +{ + public static class RoleConst + { + public const string User = "User"; + public const string Admin = "Administrator"; + + public static List GetAllNames() + { + return new List() { + User, Admin + }; + } + } +} diff --git a/ExamTemplate/Common/RoleConst.cs b/ExamTemplate/Common/RoleConst.cs deleted file mode 100644 index 7d72fea..0000000 --- a/ExamTemplate/Common/RoleConst.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; - -namespace ExamTemplate.Common -{ - public static class RoleConst - { - public const string User = "User"; - public const string Admin = "Administrator"; - - public static List GetAllNames() - { - return new List() { - User, Admin - }; - } - } -} diff --git a/ExamTemplate/Data/Data.csproj b/ExamTemplate/Data/Data.csproj deleted file mode 100644 index 098f532..0000000 --- a/ExamTemplate/Data/Data.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - net5.0 - - - diff --git a/ExamTemplate/Data/ExamTemplate.Data.Models/BaseModel.cs b/ExamTemplate/Data/ExamTemplate.Data.Models/BaseModel.cs new file mode 100644 index 0000000..5e7b75c --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data.Models/BaseModel.cs @@ -0,0 +1,13 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace ExamTemplate.Data.Models +{ + public abstract class BaseModel + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid Id { get; set; } + } +} diff --git a/ExamTemplate/Data/ExamTemplate.Data.Models/ExamTemplate.Data.Models.csproj b/ExamTemplate/Data/ExamTemplate.Data.Models/ExamTemplate.Data.Models.csproj new file mode 100644 index 0000000..7e76cb8 --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data.Models/ExamTemplate.Data.Models.csproj @@ -0,0 +1,11 @@ + + + + net5.0 + + + + + + + diff --git a/ExamTemplate/Data/ExamTemplate.Data.Models/User.cs b/ExamTemplate/Data/ExamTemplate.Data.Models/User.cs new file mode 100644 index 0000000..8fa698d --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data.Models/User.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.AspNetCore.Identity; +using System.ComponentModel.DataAnnotations.Schema; + +namespace ExamTemplate.Data.Models +{ + [Table("Users")] + public class User : IdentityUser + { + public string FirstName { get; set; } + public string LastName { get; set; } + } +} diff --git a/ExamTemplate/Data/ExamTemplate.Data/ExamTemplate.Data.csproj b/ExamTemplate/Data/ExamTemplate.Data/ExamTemplate.Data.csproj new file mode 100644 index 0000000..0e2657c --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data/ExamTemplate.Data.csproj @@ -0,0 +1,23 @@ + + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + net5.0 + + + diff --git a/ExamTemplate/Data/ExamTemplate.Data/Migrations/20210506172429_ImplementedUserAndRole.Designer.cs b/ExamTemplate/Data/ExamTemplate.Data/Migrations/20210506172429_ImplementedUserAndRole.Designer.cs new file mode 100644 index 0000000..d15b462 --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data/Migrations/20210506172429_ImplementedUserAndRole.Designer.cs @@ -0,0 +1,306 @@ +// +using System; +using ExamTemplate.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace Data.Migrations +{ + [DbContext(typeof(TemplateContext))] + [Migration("20210506172429_ImplementedUserAndRole")] + partial class ImplementedUserAndRole + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.5") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("ExamTemplate.Data.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("ExamTemplate.Data.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FirstName") + .HasColumnType("text"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("ExamTemplate.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("ExamTemplate.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("ExamTemplate.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ExamTemplate/Data/ExamTemplate.Data/Migrations/20210506172429_ImplementedUserAndRole.cs b/ExamTemplate/Data/ExamTemplate.Data/Migrations/20210506172429_ImplementedUserAndRole.cs new file mode 100644 index 0000000..a2f78ad --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data/Migrations/20210506172429_ImplementedUserAndRole.cs @@ -0,0 +1,252 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace Data.Migrations +{ + public partial class ImplementedUserAndRole : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AspNetRoles", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + ConcurrencyStamp = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetUsers", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + FirstName = table.Column(type: "text", nullable: true), + LastName = table.Column(type: "text", nullable: true), + UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + NormalizedUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + NormalizedEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + EmailConfirmed = table.Column(type: "boolean", nullable: false), + PasswordHash = table.Column(type: "text", nullable: true), + SecurityStamp = table.Column(type: "text", nullable: true), + ConcurrencyStamp = table.Column(type: "text", nullable: true), + PhoneNumber = table.Column(type: "text", nullable: true), + PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false), + TwoFactorEnabled = table.Column(type: "boolean", nullable: false), + LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true), + LockoutEnabled = table.Column(type: "boolean", nullable: false), + AccessFailedCount = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetRoleClaims", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RoleId = table.Column(type: "uuid", nullable: false), + ClaimType = table.Column(type: "text", nullable: true), + ClaimValue = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserClaims", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + UserId = table.Column(type: "uuid", nullable: false), + ClaimType = table.Column(type: "text", nullable: true), + ClaimValue = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetUserClaims_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserLogins", + columns: table => new + { + LoginProvider = table.Column(type: "text", nullable: false), + ProviderKey = table.Column(type: "text", nullable: false), + ProviderDisplayName = table.Column(type: "text", nullable: true), + UserId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); + table.ForeignKey( + name: "FK_AspNetUserLogins_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserRoles", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + RoleId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserTokens", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + LoginProvider = table.Column(type: "text", nullable: false), + Name = table.Column(type: "text", nullable: false), + Value = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AspNetUserTokens_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "RoleUser", + columns: table => new + { + RolesId = table.Column(type: "uuid", nullable: false), + UsersId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RoleUser", x => new { x.RolesId, x.UsersId }); + table.ForeignKey( + name: "FK_RoleUser_AspNetRoles_RolesId", + column: x => x.RolesId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_RoleUser_AspNetUsers_UsersId", + column: x => x.UsersId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AspNetRoleClaims_RoleId", + table: "AspNetRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "RoleNameIndex", + table: "AspNetRoles", + column: "NormalizedName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserClaims_UserId", + table: "AspNetUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserLogins_UserId", + table: "AspNetUserLogins", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserRoles_RoleId", + table: "AspNetUserRoles", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "EmailIndex", + table: "AspNetUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "UserNameIndex", + table: "AspNetUsers", + column: "NormalizedUserName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_RoleUser_UsersId", + table: "RoleUser", + column: "UsersId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AspNetRoleClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserLogins"); + + migrationBuilder.DropTable( + name: "AspNetUserRoles"); + + migrationBuilder.DropTable( + name: "AspNetUserTokens"); + + migrationBuilder.DropTable( + name: "RoleUser"); + + migrationBuilder.DropTable( + name: "AspNetRoles"); + + migrationBuilder.DropTable( + name: "AspNetUsers"); + } + } +} diff --git a/ExamTemplate/Data/ExamTemplate.Data/Migrations/TemplateContextModelSnapshot.cs b/ExamTemplate/Data/ExamTemplate.Data/Migrations/TemplateContextModelSnapshot.cs new file mode 100644 index 0000000..3286121 --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data/Migrations/TemplateContextModelSnapshot.cs @@ -0,0 +1,304 @@ +// +using System; +using ExamTemplate.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace Data.Migrations +{ + [DbContext(typeof(TemplateContext))] + partial class TemplateContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.5") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("ExamTemplate.Data.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("ExamTemplate.Data.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FirstName") + .HasColumnType("text"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("ExamTemplate.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("ExamTemplate.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("ExamTemplate.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ExamTemplate.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ExamTemplate/Data/ExamTemplate.Data/TemplateContext.cs b/ExamTemplate/Data/ExamTemplate.Data/TemplateContext.cs new file mode 100644 index 0000000..268812d --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data/TemplateContext.cs @@ -0,0 +1,23 @@ +using System; +using ExamTemplate.Data.Models; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; + +namespace ExamTemplate.Data +{ + public class TemplateContext : IdentityDbContext, Guid> + { + public TemplateContext(DbContextOptions options) + : base(options) { } + + protected override void OnModelCreating(ModelBuilder builder) + { + builder.Entity() + .HasIndex(x => x.UserName) + .IsUnique(); + + base.OnModelCreating(builder); + } + } +} diff --git a/ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs b/ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs new file mode 100644 index 0000000..dff2e9e --- /dev/null +++ b/ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; +using System.IO; + +namespace ExamTemplate.Data +{ + public class TemplateContextFactory : IDesignTimeDbContextFactory + { + public TemplateContext CreateDbContext(string[] args) + { + var configuration = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory() + "/../Web/") + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddJsonFile("appsettings.Development.json", optional: true) + .Build(); + + var optionsBuilder = new DbContextOptionsBuilder() + .UseNpgsql(configuration.GetConnectionString("LocalDBConnection")); + + return new TemplateContext(optionsBuilder.Options); + } + } +} diff --git a/ExamTemplate/Data/Migrations/20210506172429_ImplementedUserAndRole.Designer.cs b/ExamTemplate/Data/Migrations/20210506172429_ImplementedUserAndRole.Designer.cs deleted file mode 100644 index d15b462..0000000 --- a/ExamTemplate/Data/Migrations/20210506172429_ImplementedUserAndRole.Designer.cs +++ /dev/null @@ -1,306 +0,0 @@ -// -using System; -using ExamTemplate.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace Data.Migrations -{ - [DbContext(typeof(TemplateContext))] - [Migration("20210506172429_ImplementedUserAndRole")] - partial class ImplementedUserAndRole - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.5") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - modelBuilder.Entity("ExamTemplate.Data.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("ExamTemplate.Data.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.Property("RolesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("RolesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("RoleUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("ExamTemplate.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("ExamTemplate.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.HasOne("ExamTemplate.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RolesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/ExamTemplate/Data/Migrations/20210506172429_ImplementedUserAndRole.cs b/ExamTemplate/Data/Migrations/20210506172429_ImplementedUserAndRole.cs deleted file mode 100644 index a2f78ad..0000000 --- a/ExamTemplate/Data/Migrations/20210506172429_ImplementedUserAndRole.cs +++ /dev/null @@ -1,252 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace Data.Migrations -{ - public partial class ImplementedUserAndRole : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - FirstName = table.Column(type: "text", nullable: true), - LastName = table.Column(type: "text", nullable: true), - UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "boolean", nullable: false), - PasswordHash = table.Column(type: "text", nullable: true), - SecurityStamp = table.Column(type: "text", nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true), - PhoneNumber = table.Column(type: "text", nullable: true), - PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false), - TwoFactorEnabled = table.Column(type: "boolean", nullable: false), - LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true), - LockoutEnabled = table.Column(type: "boolean", nullable: false), - AccessFailedCount = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - RoleId = table.Column(type: "uuid", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - UserId = table.Column(type: "uuid", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "text", nullable: false), - ProviderKey = table.Column(type: "text", nullable: false), - ProviderDisplayName = table.Column(type: "text", nullable: true), - UserId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "uuid", nullable: false), - RoleId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "uuid", nullable: false), - LoginProvider = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false), - Value = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "RoleUser", - columns: table => new - { - RolesId = table.Column(type: "uuid", nullable: false), - UsersId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_RoleUser", x => new { x.RolesId, x.UsersId }); - table.ForeignKey( - name: "FK_RoleUser_AspNetRoles_RolesId", - column: x => x.RolesId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_RoleUser_AspNetUsers_UsersId", - column: x => x.UsersId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_RoleUser_UsersId", - table: "RoleUser", - column: "UsersId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "RoleUser"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/ExamTemplate/Data/Migrations/TemplateContextModelSnapshot.cs b/ExamTemplate/Data/Migrations/TemplateContextModelSnapshot.cs deleted file mode 100644 index 3286121..0000000 --- a/ExamTemplate/Data/Migrations/TemplateContextModelSnapshot.cs +++ /dev/null @@ -1,304 +0,0 @@ -// -using System; -using ExamTemplate.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace Data.Migrations -{ - [DbContext(typeof(TemplateContext))] - partial class TemplateContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.5") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - modelBuilder.Entity("ExamTemplate.Data.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("ExamTemplate.Data.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.Property("RolesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("RolesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("RoleUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("ExamTemplate.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("ExamTemplate.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.HasOne("ExamTemplate.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RolesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ExamTemplate.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/ExamTemplate/Data/Models/BaseModel.cs b/ExamTemplate/Data/Models/BaseModel.cs deleted file mode 100644 index 5e7b75c..0000000 --- a/ExamTemplate/Data/Models/BaseModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace ExamTemplate.Data.Models -{ - public abstract class BaseModel - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public Guid Id { get; set; } - } -} diff --git a/ExamTemplate/Data/Models/User.cs b/ExamTemplate/Data/Models/User.cs deleted file mode 100644 index 8fa698d..0000000 --- a/ExamTemplate/Data/Models/User.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using Microsoft.AspNetCore.Identity; -using System.ComponentModel.DataAnnotations.Schema; - -namespace ExamTemplate.Data.Models -{ - [Table("Users")] - public class User : IdentityUser - { - public string FirstName { get; set; } - public string LastName { get; set; } - } -} diff --git a/ExamTemplate/Data/TemplateContext.cs b/ExamTemplate/Data/TemplateContext.cs deleted file mode 100644 index 268812d..0000000 --- a/ExamTemplate/Data/TemplateContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using ExamTemplate.Data.Models; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Identity.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; - -namespace ExamTemplate.Data -{ - public class TemplateContext : IdentityDbContext, Guid> - { - public TemplateContext(DbContextOptions options) - : base(options) { } - - protected override void OnModelCreating(ModelBuilder builder) - { - builder.Entity() - .HasIndex(x => x.UserName) - .IsUnique(); - - base.OnModelCreating(builder); - } - } -} diff --git a/ExamTemplate/Data/TemplateContextFactory.cs b/ExamTemplate/Data/TemplateContextFactory.cs deleted file mode 100644 index dff2e9e..0000000 --- a/ExamTemplate/Data/TemplateContextFactory.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; -using Microsoft.Extensions.Configuration; -using System.IO; - -namespace ExamTemplate.Data -{ - public class TemplateContextFactory : IDesignTimeDbContextFactory - { - public TemplateContext CreateDbContext(string[] args) - { - var configuration = new ConfigurationBuilder() - .SetBasePath(Directory.GetCurrentDirectory() + "/../Web/") - .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) - .AddJsonFile("appsettings.Development.json", optional: true) - .Build(); - - var optionsBuilder = new DbContextOptionsBuilder() - .UseNpgsql(configuration.GetConnectionString("LocalDBConnection")); - - return new TemplateContext(optionsBuilder.Options); - } - } -} diff --git a/ExamTemplate/ExamTemplate.sln b/ExamTemplate/ExamTemplate.sln index 9dcfe98..249c0fe 100644 --- a/ExamTemplate/ExamTemplate.sln +++ b/ExamTemplate/ExamTemplate.sln @@ -3,13 +3,27 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.6.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Data", "Data\Data.csproj", "{5676382D-F650-45BF-96CD-1E99F4965233}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{2F58A03C-503A-4912-BF1D-DFFF130216C7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Services\Services.csproj", "{4BA16964-42F1-4481-8A47-1610B04398AE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Common", "Common\ExamTemplate.Common\ExamTemplate.Common.csproj", "{20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web", "Web\Web.csproj", "{5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{D9C12024-427F-4932-A0DF-BC855919EB95}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{E182AE4B-1240-4AA7-A91C-29EC71C5C818}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Data", "Data\ExamTemplate.Data\ExamTemplate.Data.csproj", "{EADFEE4F-C3F7-4826-865D-CEC88305C224}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Models", "Data\ExamTemplate.Models\ExamTemplate.Models.csproj", "{B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{595C13E8-3295-4D1F-8154-258C50302233}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Models", "Services\ExamTemplate.Models\ExamTemplate.Models.csproj", "{51146FC9-8D89-4D68-A932-8ECEA224F024}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Services", "Services\ExamTemplate.Services\ExamTemplate.Services.csproj", "{010DCE68-373D-4E45-A220-6B3EA8A8C83A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web", "Web", "{E298F85E-443F-48F6-8218-A5BAEB3AAAA2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Models", "Web\ExamTemplate.Models\ExamTemplate.Models.csproj", "{E316C321-2408-4AB6-B216-06A9779CE650}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Web", "Web\ExamTemplate.Web\ExamTemplate.Web.csproj", "{5184499B-5F09-42F0-819C-4CD927A73C55}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -24,53 +38,98 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5676382D-F650-45BF-96CD-1E99F4965233}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Debug|x64.ActiveCfg = Debug|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Debug|x64.Build.0 = Debug|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Debug|x86.ActiveCfg = Debug|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Debug|x86.Build.0 = Debug|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Release|Any CPU.Build.0 = Release|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Release|x64.ActiveCfg = Release|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Release|x64.Build.0 = Release|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Release|x86.ActiveCfg = Release|Any CPU - {5676382D-F650-45BF-96CD-1E99F4965233}.Release|x86.Build.0 = Release|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Debug|x64.ActiveCfg = Debug|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Debug|x64.Build.0 = Debug|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Debug|x86.ActiveCfg = Debug|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Debug|x86.Build.0 = Debug|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Release|Any CPU.Build.0 = Release|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Release|x64.ActiveCfg = Release|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Release|x64.Build.0 = Release|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Release|x86.ActiveCfg = Release|Any CPU - {4BA16964-42F1-4481-8A47-1610B04398AE}.Release|x86.Build.0 = Release|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Debug|x64.ActiveCfg = Debug|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Debug|x64.Build.0 = Debug|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Debug|x86.ActiveCfg = Debug|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Debug|x86.Build.0 = Debug|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Release|Any CPU.Build.0 = Release|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Release|x64.ActiveCfg = Release|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Release|x64.Build.0 = Release|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Release|x86.ActiveCfg = Release|Any CPU - {5AEF48AD-2352-43FC-8B6E-2E2A1FF3001E}.Release|x86.Build.0 = Release|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Debug|x64.ActiveCfg = Debug|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Debug|x64.Build.0 = Debug|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Debug|x86.ActiveCfg = Debug|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Debug|x86.Build.0 = Debug|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Release|Any CPU.Build.0 = Release|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Release|x64.ActiveCfg = Release|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Release|x64.Build.0 = Release|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Release|x86.ActiveCfg = Release|Any CPU - {E182AE4B-1240-4AA7-A91C-29EC71C5C818}.Release|x86.Build.0 = Release|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|x64.ActiveCfg = Debug|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|x64.Build.0 = Debug|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|x86.ActiveCfg = Debug|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|x86.Build.0 = Debug|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|Any CPU.Build.0 = Release|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|x64.ActiveCfg = Release|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|x64.Build.0 = Release|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|x86.ActiveCfg = Release|Any CPU + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|x86.Build.0 = Release|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|x64.ActiveCfg = Debug|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|x64.Build.0 = Debug|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|x86.ActiveCfg = Debug|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|x86.Build.0 = Debug|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|Any CPU.Build.0 = Release|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|x64.ActiveCfg = Release|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|x64.Build.0 = Release|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|x86.ActiveCfg = Release|Any CPU + {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|x86.Build.0 = Release|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|x64.ActiveCfg = Debug|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|x64.Build.0 = Debug|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|x86.ActiveCfg = Debug|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|x86.Build.0 = Debug|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|Any CPU.Build.0 = Release|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|x64.ActiveCfg = Release|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|x64.Build.0 = Release|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|x86.ActiveCfg = Release|Any CPU + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|x86.Build.0 = Release|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|x64.ActiveCfg = Debug|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|x64.Build.0 = Debug|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|x86.ActiveCfg = Debug|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|x86.Build.0 = Debug|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|Any CPU.Build.0 = Release|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|x64.ActiveCfg = Release|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|x64.Build.0 = Release|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|x86.ActiveCfg = Release|Any CPU + {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|x86.Build.0 = Release|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|x64.ActiveCfg = Debug|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|x64.Build.0 = Debug|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|x86.ActiveCfg = Debug|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|x86.Build.0 = Debug|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|Any CPU.Build.0 = Release|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|x64.ActiveCfg = Release|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|x64.Build.0 = Release|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|x86.ActiveCfg = Release|Any CPU + {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|x86.Build.0 = Release|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|x64.ActiveCfg = Debug|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|x64.Build.0 = Debug|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|x86.ActiveCfg = Debug|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|x86.Build.0 = Debug|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Release|Any CPU.Build.0 = Release|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Release|x64.ActiveCfg = Release|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Release|x64.Build.0 = Release|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Release|x86.ActiveCfg = Release|Any CPU + {E316C321-2408-4AB6-B216-06A9779CE650}.Release|x86.Build.0 = Release|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|x64.ActiveCfg = Debug|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|x64.Build.0 = Debug|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|x86.ActiveCfg = Debug|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|x86.Build.0 = Debug|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|Any CPU.Build.0 = Release|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|x64.ActiveCfg = Release|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|x64.Build.0 = Release|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|x86.ActiveCfg = Release|Any CPU + {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D} = {2F58A03C-503A-4912-BF1D-DFFF130216C7} + {EADFEE4F-C3F7-4826-865D-CEC88305C224} = {D9C12024-427F-4932-A0DF-BC855919EB95} + {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8} = {D9C12024-427F-4932-A0DF-BC855919EB95} + {51146FC9-8D89-4D68-A932-8ECEA224F024} = {595C13E8-3295-4D1F-8154-258C50302233} + {010DCE68-373D-4E45-A220-6B3EA8A8C83A} = {595C13E8-3295-4D1F-8154-258C50302233} + {E316C321-2408-4AB6-B216-06A9779CE650} = {E298F85E-443F-48F6-8218-A5BAEB3AAAA2} + {5184499B-5F09-42F0-819C-4CD927A73C55} = {E298F85E-443F-48F6-8218-A5BAEB3AAAA2} EndGlobalSection EndGlobal diff --git a/ExamTemplate/Services/Configurations/ServiceUserMappings.cs b/ExamTemplate/Services/Configurations/ServiceUserMappings.cs deleted file mode 100644 index 787b90f..0000000 --- a/ExamTemplate/Services/Configurations/ServiceUserMappings.cs +++ /dev/null @@ -1,15 +0,0 @@ -using AutoMapper; -using ExamTemplate.Data.Models; -using ExamTemplate.Services.Models.User; - -namespace ExamTemplate.Services.Configurations -{ - public class ServiceUserMappings : Profile - { - public ServiceUserMappings() - { - CreateMap(); - CreateMap(); - } - } -} diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/BaseServiceModel.cs b/ExamTemplate/Services/ExamTemplate.Services.Models/BaseServiceModel.cs new file mode 100644 index 0000000..62d0da3 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/BaseServiceModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace ExamTemplate.Services.Models +{ + public abstract class BaseServiceModel + { + public Guid Id { get; set; } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/ExamTemplate.Services.Models.csproj b/ExamTemplate/Services/ExamTemplate.Services.Models/ExamTemplate.Services.Models.csproj new file mode 100644 index 0000000..563e6f9 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/ExamTemplate.Services.Models.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/User/LoginUserServiceModel.cs b/ExamTemplate/Services/ExamTemplate.Services.Models/User/LoginUserServiceModel.cs new file mode 100644 index 0000000..20aaaeb --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/User/LoginUserServiceModel.cs @@ -0,0 +1,8 @@ +namespace ExamTemplate.Services.Models.User +{ + public class LoginUserServiceModel + { + public string Username { get; set; } + public string Password { get; set; } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/User/RegisterUserServiceModel.cs b/ExamTemplate/Services/ExamTemplate.Services.Models/User/RegisterUserServiceModel.cs new file mode 100644 index 0000000..b08d5ba --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/User/RegisterUserServiceModel.cs @@ -0,0 +1,10 @@ +namespace ExamTemplate.Services.Models.User +{ + public class RegisterUserServiceModel + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string Username { get; set; } + public string Password { get; set; } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/User/UserServiceModel.cs b/ExamTemplate/Services/ExamTemplate.Services.Models/User/UserServiceModel.cs new file mode 100644 index 0000000..0e8b939 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/User/UserServiceModel.cs @@ -0,0 +1,9 @@ +namespace ExamTemplate.Services.Models.User +{ + public class UserServiceModel + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string Username { get; set; } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Configurations/ServiceUserMappings.cs b/ExamTemplate/Services/ExamTemplate.Services/Configurations/ServiceUserMappings.cs new file mode 100644 index 0000000..787b90f --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Configurations/ServiceUserMappings.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using ExamTemplate.Data.Models; +using ExamTemplate.Services.Models.User; + +namespace ExamTemplate.Services.Configurations +{ + public class ServiceUserMappings : Profile + { + public ServiceUserMappings() + { + CreateMap(); + CreateMap(); + } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/ExamTemplate.Services.csproj b/ExamTemplate/Services/ExamTemplate.Services/ExamTemplate.Services.csproj new file mode 100644 index 0000000..b84928f --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/ExamTemplate.Services.csproj @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + net5.0 + + + diff --git a/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IBaseService.cs b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IBaseService.cs new file mode 100644 index 0000000..66de7b8 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IBaseService.cs @@ -0,0 +1,21 @@ +using System; +using System.Threading.Tasks; +using System.Collections.Generic; + +namespace ExamTemplate.Services.Interfaces +{ + public interface IBaseService + where DbModel : class + where ServiceModel : class + { + Task CreateAsync(ServiceModel serviceModel); + + Task GetByIdAsync(Guid id); + + Task> GetAllAsync(); + + Task EditAsync(ServiceModel serviceModel); + + Task DeleteAsync(Guid id); + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Interfaces/ICloudinaryService.cs b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/ICloudinaryService.cs new file mode 100644 index 0000000..9c4d884 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/ICloudinaryService.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace ExamTemplate.Services.Interfaces +{ + public interface ICloudinaryService + { + Task> UploadFilesToCloud(List formFiles); + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IUserService.cs b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IUserService.cs new file mode 100644 index 0000000..35f14e3 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IUserService.cs @@ -0,0 +1,25 @@ +using System.Security.Claims; +using System.Threading.Tasks; +using ExamTemplate.Services.Models.User; + +namespace ExamTemplate.Services.Interfaces +{ + public interface IUserService + { + Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel); + + Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel); + + Task LogoutAsync(); + + Task GetUserByUsernameAsync(string username); + + Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal); + + Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel); + + Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal); + + bool IsSignedIn(ClaimsPrincipal claimsPrincipal); + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Services/BaseService.cs b/ExamTemplate/Services/ExamTemplate.Services/Services/BaseService.cs new file mode 100644 index 0000000..b1b823e --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Services/BaseService.cs @@ -0,0 +1,91 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using ExamTemplate.Data; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using System.Linq; +using ExamTemplate.Services.Interfaces; +using ExamTemplate.Common; + +namespace ExamTemplate.Services.Services +{ + public abstract class BaseService : IBaseService + where DbModel : class + where ServiceModel : class + { + protected IMapper _autoMapper { get; private set; } + protected TemplateContext _context { get; private set; } + + protected BaseService(IMapper autoMapper, TemplateContext context) + { + this._autoMapper = autoMapper; + this._context = context; + } + + public virtual async Task CreateAsync(ServiceModel serviceModel) + { + if (serviceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ServiceModel))); + + DbModel newEntity = this._autoMapper.Map(serviceModel); + + await this.GetDbSet() + .AddAsync(newEntity); + + return await this.SaveChangesAsync(); + } + + public virtual async Task GetByIdAsync(Guid id) + { + if (id == Guid.Empty) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(Guid))); + + DbModel entity = await this.GetDbSet() + .FindAsync(id); + + return this._autoMapper.Map(entity); + } + + public virtual async Task> GetAllAsync() + { + return await this.GetDbSet() + .Select(x => this._autoMapper.Map(x)) + .ToListAsync(); + } + + public virtual async Task EditAsync(ServiceModel serviceModel) + { + if (serviceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ServiceModel))); + + DbModel entity = this._autoMapper.Map(serviceModel); + + this._context.Update(entity); + + return await this.SaveChangesAsync(); + } + + public virtual async Task DeleteAsync(Guid id) + { + DbModel entity = this.GetDbSet() + .Find(id); + + this._context.Remove(entity); + + return await this.SaveChangesAsync(); + } + + /// Get, Create, Edit and Delete use this method + /// Override it to add include statements (and so all other methods will work with includes too) + protected virtual DbSet GetDbSet() + { + return this._context.Set(); + } + + protected async Task SaveChangesAsync() + { + return await this._context.SaveChangesAsync() >= 1; + } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Services/CloudinaryService.cs b/ExamTemplate/Services/ExamTemplate.Services/Services/CloudinaryService.cs new file mode 100644 index 0000000..40772d9 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Services/CloudinaryService.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using CloudinaryDotNet; +using CloudinaryDotNet.Actions; +using Microsoft.AspNetCore.Http; +using ExamTemplate.Services.Interfaces; + +namespace ExamTemplate.Services.Services +{ + public class CloudinaryService : ICloudinaryService + { + // Regex for getting the filename without (final) filename extension + // So, from image.png, it will match image, and from doc.my.txt will match doc.my + private static readonly Regex s_imageRegex = new(".*(?=\\.)"); + + private readonly Cloudinary _cloudinary; + + public CloudinaryService(string cloudName, string apiKey, string apiSecret) + { + this._cloudinary = new Cloudinary(new Account(cloudName, apiKey, apiSecret)); + } + + public async Task> UploadFilesToCloud(List formFiles) + { + List fileUrls = new(); + foreach (var formFile in formFiles) + { + string fileName = s_imageRegex.Match(formFile.FileName).ToString(); + + using var ms = new MemoryStream(); + formFile.CopyTo(ms); + byte[] formBytes = ms.ToArray(); + + RawUploadParams rawUploadParams = new() + { + File = new FileDescription(fileName, new MemoryStream(formBytes)), + PublicId = fileName, + UseFilename = true + }; + + RawUploadResult rawUploadResult = await this._cloudinary.UploadAsync(rawUploadParams); + fileUrls.Add(rawUploadResult.Url.AbsoluteUri); + } + + return fileUrls; + } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Services/UserService.cs b/ExamTemplate/Services/ExamTemplate.Services/Services/UserService.cs new file mode 100644 index 0000000..4e85688 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Services/UserService.cs @@ -0,0 +1,129 @@ +using System; +using System.Security.Claims; +using System.Threading.Tasks; +using AutoMapper; +using ExamTemplate.Data; +using ExamTemplate.Data.Models; +using ExamTemplate.Services.Models.User; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using ExamTemplate.Services.Interfaces; +using ExamTemplate.Common; + +namespace ExamTemplate.Services.Services +{ + public class UserService : IUserService + { + private readonly IMapper _autoMapper; + private readonly TemplateContext _context; + private readonly SignInManager _signInManager; + private readonly UserManager _userManager; + private readonly RoleManager> _roleManager; + + public UserService(IMapper autoMapper, TemplateContext templateContext, SignInManager signInManager, UserManager userManager, RoleManager> roleManager) + { + this._autoMapper = autoMapper; + this._context = templateContext; + this._signInManager = signInManager; + this._userManager = userManager; + this._roleManager = roleManager; + } + + public async Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel) + { + if (registerUserServiceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(RegisterUserServiceModel))); + + User user = this._autoMapper.Map(registerUserServiceModel); + + user.PasswordHash = this._userManager.PasswordHasher.HashPassword(user, registerUserServiceModel.Password); + IdentityResult userCreateResult = await this._userManager.CreateAsync(user); + + if (!userCreateResult.Succeeded) + { + await this._userManager.DeleteAsync(user); + return false; + } + + IdentityResult addRoleResult; + if (await this._userManager.Users.CountAsync() == 1) // 1, because we added the user in line 37 + addRoleResult = await this._userManager.AddToRoleAsync(user, RoleConst.Admin); + else + addRoleResult = await this._userManager.AddToRoleAsync(user, RoleConst.User); + + return addRoleResult.Succeeded; + } + + public async Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel) + { + if (loginUserServiceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(LoginUserServiceModel))); + + SignInResult result = await this._signInManager.PasswordSignInAsync(loginUserServiceModel.Username, loginUserServiceModel.Password, false, false); + + return result.Succeeded; + } + + public async Task LogoutAsync() + { + await this._signInManager.SignOutAsync(); + } + + public async Task GetUserByUsernameAsync(string username) + { + if (username == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(string))); + + User user = await this._userManager.Users + .FirstOrDefaultAsync(x => x.UserName == username); + + return this._autoMapper.Map(user); + } + + public async Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal) + { + if (claimsPrincipal == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); + + User user = await this._userManager.GetUserAsync(claimsPrincipal); + + return this._autoMapper.Map(user); + } + + public async Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel) + { + if (claimsPrincipal == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); + if (userServiceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(UserServiceModel))); + + User user = await this._userManager.GetUserAsync(claimsPrincipal); + + user.UserName = userServiceModel.Username; + user.FirstName = userServiceModel.FirstName; + user.LastName = userServiceModel.LastName; + + IdentityResult result = await this._userManager.UpdateAsync(user); + return result.Succeeded; + } + + public async Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal) + { + if (claimsPrincipal == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); + + User user = await this._userManager.GetUserAsync(claimsPrincipal); + + IdentityResult result = await this._userManager.DeleteAsync(user); + return result.Succeeded; + } + + public bool IsSignedIn(ClaimsPrincipal claimsPrincipal) + { + if (claimsPrincipal == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); + + return this._signInManager.IsSignedIn(claimsPrincipal); + } + } +} diff --git a/ExamTemplate/Services/Interfaces/IBaseService.cs b/ExamTemplate/Services/Interfaces/IBaseService.cs deleted file mode 100644 index 66de7b8..0000000 --- a/ExamTemplate/Services/Interfaces/IBaseService.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Threading.Tasks; -using System.Collections.Generic; - -namespace ExamTemplate.Services.Interfaces -{ - public interface IBaseService - where DbModel : class - where ServiceModel : class - { - Task CreateAsync(ServiceModel serviceModel); - - Task GetByIdAsync(Guid id); - - Task> GetAllAsync(); - - Task EditAsync(ServiceModel serviceModel); - - Task DeleteAsync(Guid id); - } -} diff --git a/ExamTemplate/Services/Interfaces/ICloudinaryService.cs b/ExamTemplate/Services/Interfaces/ICloudinaryService.cs deleted file mode 100644 index 9c4d884..0000000 --- a/ExamTemplate/Services/Interfaces/ICloudinaryService.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; - -namespace ExamTemplate.Services.Interfaces -{ - public interface ICloudinaryService - { - Task> UploadFilesToCloud(List formFiles); - } -} diff --git a/ExamTemplate/Services/Interfaces/IUserService.cs b/ExamTemplate/Services/Interfaces/IUserService.cs deleted file mode 100644 index 35f14e3..0000000 --- a/ExamTemplate/Services/Interfaces/IUserService.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Security.Claims; -using System.Threading.Tasks; -using ExamTemplate.Services.Models.User; - -namespace ExamTemplate.Services.Interfaces -{ - public interface IUserService - { - Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel); - - Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel); - - Task LogoutAsync(); - - Task GetUserByUsernameAsync(string username); - - Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal); - - Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel); - - Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal); - - bool IsSignedIn(ClaimsPrincipal claimsPrincipal); - } -} diff --git a/ExamTemplate/Services/Models/BaseServiceModel.cs b/ExamTemplate/Services/Models/BaseServiceModel.cs deleted file mode 100644 index 62d0da3..0000000 --- a/ExamTemplate/Services/Models/BaseServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace ExamTemplate.Services.Models -{ - public abstract class BaseServiceModel - { - public Guid Id { get; set; } - } -} diff --git a/ExamTemplate/Services/Models/User/LoginUserServiceModel.cs b/ExamTemplate/Services/Models/User/LoginUserServiceModel.cs deleted file mode 100644 index 20aaaeb..0000000 --- a/ExamTemplate/Services/Models/User/LoginUserServiceModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace ExamTemplate.Services.Models.User -{ - public class LoginUserServiceModel - { - public string Username { get; set; } - public string Password { get; set; } - } -} diff --git a/ExamTemplate/Services/Models/User/RegisterUserServiceModel.cs b/ExamTemplate/Services/Models/User/RegisterUserServiceModel.cs deleted file mode 100644 index b08d5ba..0000000 --- a/ExamTemplate/Services/Models/User/RegisterUserServiceModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ExamTemplate.Services.Models.User -{ - public class RegisterUserServiceModel - { - public string FirstName { get; set; } - public string LastName { get; set; } - public string Username { get; set; } - public string Password { get; set; } - } -} diff --git a/ExamTemplate/Services/Models/User/UserServiceModel.cs b/ExamTemplate/Services/Models/User/UserServiceModel.cs deleted file mode 100644 index 0e8b939..0000000 --- a/ExamTemplate/Services/Models/User/UserServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace ExamTemplate.Services.Models.User -{ - public class UserServiceModel - { - public string FirstName { get; set; } - public string LastName { get; set; } - public string Username { get; set; } - } -} diff --git a/ExamTemplate/Services/Services.csproj b/ExamTemplate/Services/Services.csproj deleted file mode 100644 index eb60f3d..0000000 --- a/ExamTemplate/Services/Services.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - net5.0 - - - diff --git a/ExamTemplate/Services/Services/BaseService.cs b/ExamTemplate/Services/Services/BaseService.cs deleted file mode 100644 index b1b823e..0000000 --- a/ExamTemplate/Services/Services/BaseService.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using ExamTemplate.Data; -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore; -using System.Linq; -using ExamTemplate.Services.Interfaces; -using ExamTemplate.Common; - -namespace ExamTemplate.Services.Services -{ - public abstract class BaseService : IBaseService - where DbModel : class - where ServiceModel : class - { - protected IMapper _autoMapper { get; private set; } - protected TemplateContext _context { get; private set; } - - protected BaseService(IMapper autoMapper, TemplateContext context) - { - this._autoMapper = autoMapper; - this._context = context; - } - - public virtual async Task CreateAsync(ServiceModel serviceModel) - { - if (serviceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ServiceModel))); - - DbModel newEntity = this._autoMapper.Map(serviceModel); - - await this.GetDbSet() - .AddAsync(newEntity); - - return await this.SaveChangesAsync(); - } - - public virtual async Task GetByIdAsync(Guid id) - { - if (id == Guid.Empty) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(Guid))); - - DbModel entity = await this.GetDbSet() - .FindAsync(id); - - return this._autoMapper.Map(entity); - } - - public virtual async Task> GetAllAsync() - { - return await this.GetDbSet() - .Select(x => this._autoMapper.Map(x)) - .ToListAsync(); - } - - public virtual async Task EditAsync(ServiceModel serviceModel) - { - if (serviceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ServiceModel))); - - DbModel entity = this._autoMapper.Map(serviceModel); - - this._context.Update(entity); - - return await this.SaveChangesAsync(); - } - - public virtual async Task DeleteAsync(Guid id) - { - DbModel entity = this.GetDbSet() - .Find(id); - - this._context.Remove(entity); - - return await this.SaveChangesAsync(); - } - - /// Get, Create, Edit and Delete use this method - /// Override it to add include statements (and so all other methods will work with includes too) - protected virtual DbSet GetDbSet() - { - return this._context.Set(); - } - - protected async Task SaveChangesAsync() - { - return await this._context.SaveChangesAsync() >= 1; - } - } -} diff --git a/ExamTemplate/Services/Services/CloudinaryService.cs b/ExamTemplate/Services/Services/CloudinaryService.cs deleted file mode 100644 index 40772d9..0000000 --- a/ExamTemplate/Services/Services/CloudinaryService.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using CloudinaryDotNet; -using CloudinaryDotNet.Actions; -using Microsoft.AspNetCore.Http; -using ExamTemplate.Services.Interfaces; - -namespace ExamTemplate.Services.Services -{ - public class CloudinaryService : ICloudinaryService - { - // Regex for getting the filename without (final) filename extension - // So, from image.png, it will match image, and from doc.my.txt will match doc.my - private static readonly Regex s_imageRegex = new(".*(?=\\.)"); - - private readonly Cloudinary _cloudinary; - - public CloudinaryService(string cloudName, string apiKey, string apiSecret) - { - this._cloudinary = new Cloudinary(new Account(cloudName, apiKey, apiSecret)); - } - - public async Task> UploadFilesToCloud(List formFiles) - { - List fileUrls = new(); - foreach (var formFile in formFiles) - { - string fileName = s_imageRegex.Match(formFile.FileName).ToString(); - - using var ms = new MemoryStream(); - formFile.CopyTo(ms); - byte[] formBytes = ms.ToArray(); - - RawUploadParams rawUploadParams = new() - { - File = new FileDescription(fileName, new MemoryStream(formBytes)), - PublicId = fileName, - UseFilename = true - }; - - RawUploadResult rawUploadResult = await this._cloudinary.UploadAsync(rawUploadParams); - fileUrls.Add(rawUploadResult.Url.AbsoluteUri); - } - - return fileUrls; - } - } -} diff --git a/ExamTemplate/Services/Services/UserService.cs b/ExamTemplate/Services/Services/UserService.cs deleted file mode 100644 index 4e85688..0000000 --- a/ExamTemplate/Services/Services/UserService.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Security.Claims; -using System.Threading.Tasks; -using AutoMapper; -using ExamTemplate.Data; -using ExamTemplate.Data.Models; -using ExamTemplate.Services.Models.User; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; -using ExamTemplate.Services.Interfaces; -using ExamTemplate.Common; - -namespace ExamTemplate.Services.Services -{ - public class UserService : IUserService - { - private readonly IMapper _autoMapper; - private readonly TemplateContext _context; - private readonly SignInManager _signInManager; - private readonly UserManager _userManager; - private readonly RoleManager> _roleManager; - - public UserService(IMapper autoMapper, TemplateContext templateContext, SignInManager signInManager, UserManager userManager, RoleManager> roleManager) - { - this._autoMapper = autoMapper; - this._context = templateContext; - this._signInManager = signInManager; - this._userManager = userManager; - this._roleManager = roleManager; - } - - public async Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel) - { - if (registerUserServiceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(RegisterUserServiceModel))); - - User user = this._autoMapper.Map(registerUserServiceModel); - - user.PasswordHash = this._userManager.PasswordHasher.HashPassword(user, registerUserServiceModel.Password); - IdentityResult userCreateResult = await this._userManager.CreateAsync(user); - - if (!userCreateResult.Succeeded) - { - await this._userManager.DeleteAsync(user); - return false; - } - - IdentityResult addRoleResult; - if (await this._userManager.Users.CountAsync() == 1) // 1, because we added the user in line 37 - addRoleResult = await this._userManager.AddToRoleAsync(user, RoleConst.Admin); - else - addRoleResult = await this._userManager.AddToRoleAsync(user, RoleConst.User); - - return addRoleResult.Succeeded; - } - - public async Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel) - { - if (loginUserServiceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(LoginUserServiceModel))); - - SignInResult result = await this._signInManager.PasswordSignInAsync(loginUserServiceModel.Username, loginUserServiceModel.Password, false, false); - - return result.Succeeded; - } - - public async Task LogoutAsync() - { - await this._signInManager.SignOutAsync(); - } - - public async Task GetUserByUsernameAsync(string username) - { - if (username == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(string))); - - User user = await this._userManager.Users - .FirstOrDefaultAsync(x => x.UserName == username); - - return this._autoMapper.Map(user); - } - - public async Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal) - { - if (claimsPrincipal == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); - - User user = await this._userManager.GetUserAsync(claimsPrincipal); - - return this._autoMapper.Map(user); - } - - public async Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel) - { - if (claimsPrincipal == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); - if (userServiceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(UserServiceModel))); - - User user = await this._userManager.GetUserAsync(claimsPrincipal); - - user.UserName = userServiceModel.Username; - user.FirstName = userServiceModel.FirstName; - user.LastName = userServiceModel.LastName; - - IdentityResult result = await this._userManager.UpdateAsync(user); - return result.Succeeded; - } - - public async Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal) - { - if (claimsPrincipal == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); - - User user = await this._userManager.GetUserAsync(claimsPrincipal); - - IdentityResult result = await this._userManager.DeleteAsync(user); - return result.Succeeded; - } - - public bool IsSignedIn(ClaimsPrincipal claimsPrincipal) - { - if (claimsPrincipal == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); - - return this._signInManager.IsSignedIn(claimsPrincipal); - } - } -} diff --git a/ExamTemplate/Web/Configurations/ControllerUserMappings.cs b/ExamTemplate/Web/Configurations/ControllerUserMappings.cs deleted file mode 100644 index 05c57e2..0000000 --- a/ExamTemplate/Web/Configurations/ControllerUserMappings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using AutoMapper; -using ExamTemplate.Services.Models.User; -using ExamTemplate.Web.Models.User; - -namespace ExamTemplate.Services.Configurations -{ - public class ControllerUserMappings : Profile - { - public ControllerUserMappings() - { - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - } - } -} diff --git a/ExamTemplate/Web/Controllers/AccountController.cs b/ExamTemplate/Web/Controllers/AccountController.cs deleted file mode 100644 index 2c2eb32..0000000 --- a/ExamTemplate/Web/Controllers/AccountController.cs +++ /dev/null @@ -1,146 +0,0 @@ -using ExamTemplate.Services.Interfaces; -using Microsoft.AspNetCore.Mvc; -using ExamTemplate.Web.Models.User; -using AutoMapper; -using ExamTemplate.Services.Models.User; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; - -namespace ExamTemplate.Web.Controllers -{ - [Authorize] - public class AccountController : Controller - { - private readonly IMapper _autoMapper; - private readonly IUserService _userService; - - public AccountController(IMapper autoMapper, IUserService userService) - { - this._autoMapper = autoMapper; - this._userService = userService; - } - - [HttpGet] - [AllowAnonymous] - public IActionResult Register() - { - return View(); - } - - [HttpPost] - [AllowAnonymous] - public async Task Register(RegisterUserWebModel registerUserWebModel) - { - if (!ModelState.IsValid) - return View(registerUserWebModel); - - RegisterUserServiceModel registerUserServiceModel = this._autoMapper.Map(registerUserWebModel); - - bool result = await this._userService.RegisterUserAsync(registerUserServiceModel); - - if (result) - return await this.Login(new LoginUserWebModel { - Username = registerUserServiceModel.Username, - Password = registerUserServiceModel.Password - }); - else - return View(registerUserWebModel); - } - - [HttpGet] - [AllowAnonymous] - public IActionResult Login() - { - return View(); - } - - [HttpPost] - [AllowAnonymous] - public async Task Login(LoginUserWebModel loginUserWebModel) - { - if (!ModelState.IsValid) - return View(loginUserWebModel); - - LoginUserServiceModel loginUserServiceModel = this._autoMapper.Map(loginUserWebModel); - - bool result = await this._userService.LoginUserAsync(loginUserServiceModel); - - if (result) - return RedirectToAction("Index", "Home"); - else - return View(loginUserWebModel); - } - - [HttpPost] - public async Task Logout() - { - await this._userService.LogoutAsync(); - - return RedirectToAction("Login"); - } - - [HttpGet] - [AllowAnonymous] - public async Task Profile(string username) - { - UserServiceModel userServiceModel = await this._userService.GetUserByUsernameAsync(username); - - if (userServiceModel == default(UserServiceModel)) - return RedirectToAction("ErrorNotFound", "Home"); - - UserWebModel userWebModel = this._autoMapper.Map(userServiceModel); - - return View(userWebModel); - } - - [HttpGet] - public async Task Edit() - { - UserServiceModel userServiceModel = await this._userService.GetUserByClaimsAsync(this.HttpContext.User); - - if (userServiceModel == default(UserServiceModel)) - return RedirectToAction("ErrorNotFound", "Home"); - - EditUserWebModel editUserWebModel = this._autoMapper.Map(userServiceModel); - - return View(editUserWebModel); - } - - [HttpPost] - public async Task Edit(EditUserWebModel editUserWebModel) - { - if (!ModelState.IsValid) - return View(editUserWebModel); - - if (!this._userService.IsSignedIn(HttpContext.User)) - return RedirectToAction("Login"); - - UserServiceModel loggedInUser = await this._userService.GetUserByClaimsAsync(HttpContext.User); - - UserServiceModel userServiceModel = this._autoMapper.Map(editUserWebModel); - bool result = await this._userService.EditUserAsync(HttpContext.User, userServiceModel); - - if (result) - { - if (loggedInUser.Username != editUserWebModel.Username) - await this._userService.LogoutAsync(); - - return RedirectToAction("Profile", new { username = editUserWebModel.Username }); - } - else - return RedirectToAction("Profile", new { username = loggedInUser.Username }); - } - - [HttpPost] - public async Task Delete() - { - await this._userService.LogoutAsync(); - bool result = await this._userService.DeleteUserAsync(HttpContext.User); - - if (result) - return RedirectToAction("Login"); - else - return RedirectToAction("Index", "Home"); - } - } -} diff --git a/ExamTemplate/Web/Controllers/HomeController.cs b/ExamTemplate/Web/Controllers/HomeController.cs deleted file mode 100644 index d9cfc45..0000000 --- a/ExamTemplate/Web/Controllers/HomeController.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Diagnostics; -using ExamTemplate.Web.Models; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; - -namespace ExamTemplate.Web.Controllers -{ - public class HomeController : Controller - { - private readonly ILogger _logger; - - public HomeController(ILogger logger) - { - _logger = logger; - } - - public IActionResult Index() - { - return View(); - } - - [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] - public IActionResult Error() - { - return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); - } - - public IActionResult ErrorNotFound() - { - return View(); - } - } -} diff --git a/ExamTemplate/Web/ExamTemplate.Web.Models/BaseWebModel.cs b/ExamTemplate/Web/ExamTemplate.Web.Models/BaseWebModel.cs new file mode 100644 index 0000000..1b662af --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web.Models/BaseWebModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace ExamTemplate.Web.Models +{ + public abstract class BaseWebModel + { + public Guid Id { get; set; } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web.Models/ErrorViewModel.cs b/ExamTemplate/Web/ExamTemplate.Web.Models/ErrorViewModel.cs new file mode 100644 index 0000000..af40d4c --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web.Models/ErrorViewModel.cs @@ -0,0 +1,9 @@ +namespace ExamTemplate.Web.Models +{ + public class ErrorViewModel + { + public string RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web.Models/ExamTemplate.Web.Models.csproj b/ExamTemplate/Web/ExamTemplate.Web.Models/ExamTemplate.Web.Models.csproj new file mode 100644 index 0000000..563e6f9 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web.Models/ExamTemplate.Web.Models.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/ExamTemplate/Web/ExamTemplate.Web.Models/User/EditUserWebModel.cs b/ExamTemplate/Web/ExamTemplate.Web.Models/User/EditUserWebModel.cs new file mode 100644 index 0000000..119a585 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web.Models/User/EditUserWebModel.cs @@ -0,0 +1,19 @@ +using System.ComponentModel.DataAnnotations; + +namespace ExamTemplate.Web.Models.User +{ + public class EditUserWebModel + { + [Required] + [MinLength(1)] + public string FirstName { get; set; } + + [Required] + [MinLength(1)] + public string LastName { get; set; } + + [Required] + [MinLength(1)] + public string Username { get; set; } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web.Models/User/LoginUserWebModel.cs b/ExamTemplate/Web/ExamTemplate.Web.Models/User/LoginUserWebModel.cs new file mode 100644 index 0000000..0f4ef73 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web.Models/User/LoginUserWebModel.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace ExamTemplate.Web.Models.User +{ + public class LoginUserWebModel + { + [Required] + [MinLength(1)] + public string Username { get; set; } + + [Required] + [MinLength(1)] + public string Password { get; set; } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web.Models/User/RegisterUserWebModel.cs b/ExamTemplate/Web/ExamTemplate.Web.Models/User/RegisterUserWebModel.cs new file mode 100644 index 0000000..c443dd2 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web.Models/User/RegisterUserWebModel.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; + +namespace ExamTemplate.Web.Models.User +{ + public class RegisterUserWebModel + { + [Required] + [MinLength(1)] + public string FirstName { get; set; } + + [Required] + [MinLength(1)] + public string LastName { get; set; } + + [Required] + [MinLength(1)] + public string Username { get; set; } + + [Required] + [MinLength(3)] + public string Password { get; set; } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web.Models/User/UserWebModel.cs b/ExamTemplate/Web/ExamTemplate.Web.Models/User/UserWebModel.cs new file mode 100644 index 0000000..af8d6c7 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web.Models/User/UserWebModel.cs @@ -0,0 +1,9 @@ +namespace ExamTemplate.Web.Models.User +{ + public class UserWebModel + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string Username { get; set; } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/Configurations/ControllerUserMappings.cs b/ExamTemplate/Web/ExamTemplate.Web/Configurations/ControllerUserMappings.cs new file mode 100644 index 0000000..05c57e2 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Configurations/ControllerUserMappings.cs @@ -0,0 +1,18 @@ +using AutoMapper; +using ExamTemplate.Services.Models.User; +using ExamTemplate.Web.Models.User; + +namespace ExamTemplate.Services.Configurations +{ + public class ControllerUserMappings : Profile + { + public ControllerUserMappings() + { + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/Controllers/AccountController.cs b/ExamTemplate/Web/ExamTemplate.Web/Controllers/AccountController.cs new file mode 100644 index 0000000..2c2eb32 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Controllers/AccountController.cs @@ -0,0 +1,146 @@ +using ExamTemplate.Services.Interfaces; +using Microsoft.AspNetCore.Mvc; +using ExamTemplate.Web.Models.User; +using AutoMapper; +using ExamTemplate.Services.Models.User; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; + +namespace ExamTemplate.Web.Controllers +{ + [Authorize] + public class AccountController : Controller + { + private readonly IMapper _autoMapper; + private readonly IUserService _userService; + + public AccountController(IMapper autoMapper, IUserService userService) + { + this._autoMapper = autoMapper; + this._userService = userService; + } + + [HttpGet] + [AllowAnonymous] + public IActionResult Register() + { + return View(); + } + + [HttpPost] + [AllowAnonymous] + public async Task Register(RegisterUserWebModel registerUserWebModel) + { + if (!ModelState.IsValid) + return View(registerUserWebModel); + + RegisterUserServiceModel registerUserServiceModel = this._autoMapper.Map(registerUserWebModel); + + bool result = await this._userService.RegisterUserAsync(registerUserServiceModel); + + if (result) + return await this.Login(new LoginUserWebModel { + Username = registerUserServiceModel.Username, + Password = registerUserServiceModel.Password + }); + else + return View(registerUserWebModel); + } + + [HttpGet] + [AllowAnonymous] + public IActionResult Login() + { + return View(); + } + + [HttpPost] + [AllowAnonymous] + public async Task Login(LoginUserWebModel loginUserWebModel) + { + if (!ModelState.IsValid) + return View(loginUserWebModel); + + LoginUserServiceModel loginUserServiceModel = this._autoMapper.Map(loginUserWebModel); + + bool result = await this._userService.LoginUserAsync(loginUserServiceModel); + + if (result) + return RedirectToAction("Index", "Home"); + else + return View(loginUserWebModel); + } + + [HttpPost] + public async Task Logout() + { + await this._userService.LogoutAsync(); + + return RedirectToAction("Login"); + } + + [HttpGet] + [AllowAnonymous] + public async Task Profile(string username) + { + UserServiceModel userServiceModel = await this._userService.GetUserByUsernameAsync(username); + + if (userServiceModel == default(UserServiceModel)) + return RedirectToAction("ErrorNotFound", "Home"); + + UserWebModel userWebModel = this._autoMapper.Map(userServiceModel); + + return View(userWebModel); + } + + [HttpGet] + public async Task Edit() + { + UserServiceModel userServiceModel = await this._userService.GetUserByClaimsAsync(this.HttpContext.User); + + if (userServiceModel == default(UserServiceModel)) + return RedirectToAction("ErrorNotFound", "Home"); + + EditUserWebModel editUserWebModel = this._autoMapper.Map(userServiceModel); + + return View(editUserWebModel); + } + + [HttpPost] + public async Task Edit(EditUserWebModel editUserWebModel) + { + if (!ModelState.IsValid) + return View(editUserWebModel); + + if (!this._userService.IsSignedIn(HttpContext.User)) + return RedirectToAction("Login"); + + UserServiceModel loggedInUser = await this._userService.GetUserByClaimsAsync(HttpContext.User); + + UserServiceModel userServiceModel = this._autoMapper.Map(editUserWebModel); + bool result = await this._userService.EditUserAsync(HttpContext.User, userServiceModel); + + if (result) + { + if (loggedInUser.Username != editUserWebModel.Username) + await this._userService.LogoutAsync(); + + return RedirectToAction("Profile", new { username = editUserWebModel.Username }); + } + else + return RedirectToAction("Profile", new { username = loggedInUser.Username }); + } + + [HttpPost] + public async Task Delete() + { + await this._userService.LogoutAsync(); + bool result = await this._userService.DeleteUserAsync(HttpContext.User); + + if (result) + return RedirectToAction("Login"); + else + return RedirectToAction("Index", "Home"); + } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/Controllers/HomeController.cs b/ExamTemplate/Web/ExamTemplate.Web/Controllers/HomeController.cs new file mode 100644 index 0000000..d9cfc45 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Controllers/HomeController.cs @@ -0,0 +1,33 @@ +using System.Diagnostics; +using ExamTemplate.Web.Models; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; + +namespace ExamTemplate.Web.Controllers +{ + public class HomeController : Controller + { + private readonly ILogger _logger; + + public HomeController(ILogger logger) + { + _logger = logger; + } + + public IActionResult Index() + { + return View(); + } + + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + public IActionResult Error() + { + return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); + } + + public IActionResult ErrorNotFound() + { + return View(); + } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/ExamTemplate.Web.csproj b/ExamTemplate/Web/ExamTemplate.Web/ExamTemplate.Web.csproj new file mode 100644 index 0000000..d2c2de4 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/ExamTemplate.Web.csproj @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + net5.0 + + + diff --git a/ExamTemplate/Web/ExamTemplate.Web/Program.cs b/ExamTemplate/Web/ExamTemplate.Web/Program.cs new file mode 100644 index 0000000..be33374 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Program.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace ExamTemplate.Web +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/Properties/launchSettings.json b/ExamTemplate/Web/ExamTemplate.Web/Properties/launchSettings.json new file mode 100644 index 0000000..080115b --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:36205", + "sslPort": 44322 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Web": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/Startup.cs b/ExamTemplate/Web/ExamTemplate.Web/Startup.cs new file mode 100644 index 0000000..c18bca6 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Startup.cs @@ -0,0 +1,134 @@ +using System; +using System.Linq; +using ExamTemplate.Common; +using ExamTemplate.Data; +using ExamTemplate.Data.Models; +using ExamTemplate.Services.Services; +using ExamTemplate.Services.Interfaces; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace ExamTemplate.Web +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddControllersWithViews(); + services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); + + /* + * Dependency Injection configuration + */ + + services.AddTransient(options => + new CloudinaryService( + cloudName: this.Configuration.GetSection("Cloud").GetSection("cloudName").Value, + apiKey: this.Configuration.GetSection("Cloud").GetSection("apiKey").Value, + apiSecret: this.Configuration.GetSection("Cloud").GetSection("apiSecret").Value)); + services.AddTransient(); + + /* + * Database configuration + */ + + services.AddDbContext(options => + options.UseNpgsql(this.Configuration.GetConnectionString("LocalDBConnection"))); + + // Needed for SignInManager and UserManager + services.AddIdentity>(options => + { + options.SignIn.RequireConfirmedAccount = false; + + // Password settings + options.Password.RequireDigit = false; + options.Password.RequireLowercase = false; + options.Password.RequireNonAlphanumeric = false; + options.Password.RequireUppercase = false; + options.Password.RequiredLength = 3; + options.Password.RequiredUniqueChars = 0; + }).AddRoles>() + .AddEntityFrameworkStores(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Home/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseStaticFiles(); + + app.UseRouting(); + + app.UseAuthentication(); + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute( + name: "default", + pattern: "{controller=Home}/{action=Index}/{id?}"); + endpoints.MapFallbackToController("ErrorNotFound", "Home"); + }); + + /* + * Make sure that the database is migrated + * and that the User and Admin role exist in database + */ + + using var serviceScope = app.ApplicationServices.CreateScope(); + using var dbContext = serviceScope.ServiceProvider.GetRequiredService(); + + dbContext.Database.Migrate(); + + var roleManager = (RoleManager>)serviceScope.ServiceProvider.GetService(typeof(RoleManager>)); + foreach (string name in RoleConst.GetAllNames()) + { + if (!dbContext.Roles.Any(x => x.Name == name)) + { + IdentityRole role = new IdentityRole() { Name = name }; + roleManager.CreateAsync(role).Wait(); + } + } + + /* If you want to create some custom database values at startup + * uncomment the following code + * and replace OBJCONST_ with your static class with constants (e.g. RoleConst) + * replace OBJS_ with the name of the DbSet of your database model (e.g. Roles) + * replace OBJ_ with the name of your database model (e.g. Role) + + foreach (string name in OBJCONST_.GetAllNames()) + { + if (!dbContext.OBJS_.Any(x => x.Name == name)) + { + var entity = new OBJ_() { Id = Guid.NewGuid(), Name = name }; + dbContext.OBJS_.Add(entity); + dbContext.SaveChanges(); + } + } + */ + } + } +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Edit.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Edit.cshtml new file mode 100644 index 0000000..a088742 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Edit.cshtml @@ -0,0 +1,20 @@ +@model EditUserWebModel +@{ + ViewData["Title"] = "Edit Profile"; +} + +
+ + + + + + + + + + + + + +
diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Login.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Login.cshtml new file mode 100644 index 0000000..daa3f3e --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Login.cshtml @@ -0,0 +1,23 @@ +@model LoginUserWebModel +@{ + ViewData["Title"] = "Login"; +} + +
+ + + + + + + + + @if (Model != null) + { +

+ Invalid credentials or account doesn't exist! +

+ } +
+ + diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Profile.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Profile.cshtml new file mode 100644 index 0000000..33fc882 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Profile.cshtml @@ -0,0 +1,33 @@ +@using Microsoft.AspNetCore.Identity + +@inject SignInManager SignInManager +@inject UserManager UserManager + +@model UserWebModel +@{ + ViewData["Title"] = Model.Username + "'s Profile"; +} + +

+

+ @Model.FirstName @Model.LastName +

+
+ @Model.Username +
+ @if (SignInManager.IsSignedIn(User)) + { + @if(UserManager.GetUserName(User) == Model.Username) + { +
+ +
+ +
+ +
+ +
+ } + } +

diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Register.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Register.cshtml new file mode 100644 index 0000000..e436d72 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Account/Register.cshtml @@ -0,0 +1,27 @@ +@model RegisterUserWebModel +@{ + ViewData["Title"] = "Register"; +} + +
+ + + + + + + + + + + + + + + @if (Model != null) + { +

+ Couldn't register account! +

+ } +
diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Home/Index.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Home/Index.cshtml new file mode 100644 index 0000000..56ea950 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Home/Index.cshtml @@ -0,0 +1,8 @@ +@{ + ViewData["Title"] = "Home"; +} + +
+

Welcome

+

Learn about building Web apps with ASP.NET Core.

+
diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/Error.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/Error.cshtml new file mode 100644 index 0000000..5a7ce95 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/Error.cshtml @@ -0,0 +1,25 @@ +@model ErrorViewModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/ErrorNotFound.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/ErrorNotFound.cshtml new file mode 100644 index 0000000..39fc5ca --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/ErrorNotFound.cshtml @@ -0,0 +1,10 @@ +@{ + ViewData["Title"] = "404: Not found!"; +} + +

+ 404: Not found! +

+

+ The page you're looking for couldn't be found! +

diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_FooterContent.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_FooterContent.cshtml new file mode 100644 index 0000000..60a21aa --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_FooterContent.cshtml @@ -0,0 +1,8 @@ +
+ +
diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_Layout.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..dd7bf82 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_Layout.cshtml @@ -0,0 +1,25 @@ + + + + + + @ViewData["Title"] + + + + +
+ +
+ +
+
+ @RenderBody() +
+
+ +
+ +
+ + diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_Navbar.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_Navbar.cshtml new file mode 100644 index 0000000..0ec5c4d --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/Shared/_Navbar.cshtml @@ -0,0 +1,31 @@ +@using Microsoft.AspNetCore.Identity + +@inject SignInManager SignInManager +@inject UserManager UserManager + + diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/_ViewImports.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/_ViewImports.cshtml new file mode 100644 index 0000000..18502e4 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/_ViewImports.cshtml @@ -0,0 +1,5 @@ +@using ExamTemplate.Web +@using ExamTemplate.Web.Models +@using ExamTemplate.Web.Models.User +@using ExamTemplate.Data.Models +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/ExamTemplate/Web/ExamTemplate.Web/Views/_ViewStart.cshtml b/ExamTemplate/Web/ExamTemplate.Web/Views/_ViewStart.cshtml new file mode 100644 index 0000000..3a04d05 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/appsettings.json b/ExamTemplate/Web/ExamTemplate.Web/appsettings.json new file mode 100644 index 0000000..f1b58be --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/appsettings.json @@ -0,0 +1,18 @@ +{ + "ConnectionStrings": { + "LocalDBConnection": "Server=localhost;Port=5432;Database=TemplateContext;User Id=;Password=;" + }, + "Cloud": { + "cloudName": "ExamTemplate", + "apiKey": "", + "apiSecret": "" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/wwwroot/css/site.css b/ExamTemplate/Web/ExamTemplate.Web/wwwroot/css/site.css new file mode 100644 index 0000000..5923427 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/wwwroot/css/site.css @@ -0,0 +1,79 @@ +/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification +for details on configuring this project to bundle and minify static web assets. */ + +a.navbar-brand { + white-space: normal; + text-align: center; + word-break: break-all; +} + +/* Provide sufficient contrast against white background */ +a { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.nav-pills .nav-link.active, .nav-pills .show > .nav-link { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +/* Sticky footer styles +-------------------------------------------------- */ +html { + font-size: 14px; +} +@media (min-width: 768px) { + html { + font-size: 16px; + } +} + +.border-top { + border-top: 1px solid #e5e5e5; +} +.border-bottom { + border-bottom: 1px solid #e5e5e5; +} + +.box-shadow { + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); +} + +button.accept-policy { + font-size: 1rem; + line-height: inherit; +} + +/* Sticky footer styles +-------------------------------------------------- */ +html { + position: relative; + min-height: 100%; + line-height: 1.15; +} + +body { + min-height: 100vh; + margin: 0; + font-size: 1.15em; + background-color: white; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} + +/* The following is kinda dirty, that's why it's separated */ + +body { + display: flex; + flex-direction: column; +} + +body > main { + flex: 1; +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/wwwroot/css/styles.css b/ExamTemplate/Web/ExamTemplate.Web/wwwroot/css/styles.css new file mode 100644 index 0000000..e7fc7b3 --- /dev/null +++ b/ExamTemplate/Web/ExamTemplate.Web/wwwroot/css/styles.css @@ -0,0 +1,143 @@ + +/* Change the maximum width of content (stuff inside pages and navbar), + * depending on width of browser window. + * Configuration copied from default Bootstrap + */ + +@media (min-width: 576px) { + :root { + --max-content-width: 540px; + } +} + +@media (min-width: 768px) { + :root { + --max-content-width: 720px; + } +} + +@media (min-width: 992px) { + :root { + --max-content-width: 960px; + } +} + +@media (min-width: 1200px) { + :root { + --max-content-width: 1140px; + } +} + +/* Main */ + +.main { + width: 100%; + height: 100%; +} + + /* Stuff that you need in the middle portion + * of the screen (like the stuff inside the + * navbar and footer) should be inside + * an element with this tag + */ +.middle-content-container { + max-width: var(--max-content-width); + margin-left: auto; + margin-right: auto; +} + +/* Navbar and footer */ + +.navbar, .footer-content { + width: 100%; + min-height: 45px; + + padding-top: 8px; + padding-bottom: 8px; + + display: flex; + align-items: center; + justify-content: center; +} + +.navbar section > :not(*:first-child) { + padding-left: 5px; +} + +.navbar section > :not(*:last-child) { + padding-right: 5px; +} + +.navbar a { + text-decoration: none; + color: #343a40; +} + +.navbar a:hover { + color: black; +} + +.navbar-contents { + width: 100%; + display: flex; + box-sizing: border-box; +} + +.navbar-contents > * { + display: flex; + align-items: center; + justify-content: center; +} + +/* Forms */ + +form { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: fit-content; +} + +.main > div > form { + margin-top: 10px; +} + +.main > div > form:first-child { + width: 100%; + max-width: 300px; + margin-left: auto; + margin-right: auto; +} + +form > * { + width: 100%; + box-sizing: border-box; +} + +input { + margin: 5px; + padding: 9px; + border: 1px solid darkgrey; + border-radius: 4px; +} + +input[type="submit"] { + color: white; + background-color: black; +} + +input[type="submit"]:hover { + cursor: pointer; +} + +.form-error { + font-size: 0.8em; + color: red; +} + +/* Other general stuff */ + +.flex-spacer { + flex: 1; +} diff --git a/ExamTemplate/Web/ExamTemplate.Web/wwwroot/favicon.ico b/ExamTemplate/Web/ExamTemplate.Web/wwwroot/favicon.ico new file mode 100644 index 0000000..a3a7999 Binary files /dev/null and b/ExamTemplate/Web/ExamTemplate.Web/wwwroot/favicon.ico differ diff --git a/ExamTemplate/Web/Models/BaseWebModel.cs b/ExamTemplate/Web/Models/BaseWebModel.cs deleted file mode 100644 index 1b662af..0000000 --- a/ExamTemplate/Web/Models/BaseWebModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace ExamTemplate.Web.Models -{ - public abstract class BaseWebModel - { - public Guid Id { get; set; } - } -} diff --git a/ExamTemplate/Web/Models/ErrorViewModel.cs b/ExamTemplate/Web/Models/ErrorViewModel.cs deleted file mode 100644 index af40d4c..0000000 --- a/ExamTemplate/Web/Models/ErrorViewModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace ExamTemplate.Web.Models -{ - public class ErrorViewModel - { - public string RequestId { get; set; } - - public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); - } -} diff --git a/ExamTemplate/Web/Models/User/EditUserWebModel.cs b/ExamTemplate/Web/Models/User/EditUserWebModel.cs deleted file mode 100644 index 119a585..0000000 --- a/ExamTemplate/Web/Models/User/EditUserWebModel.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace ExamTemplate.Web.Models.User -{ - public class EditUserWebModel - { - [Required] - [MinLength(1)] - public string FirstName { get; set; } - - [Required] - [MinLength(1)] - public string LastName { get; set; } - - [Required] - [MinLength(1)] - public string Username { get; set; } - } -} diff --git a/ExamTemplate/Web/Models/User/LoginUserWebModel.cs b/ExamTemplate/Web/Models/User/LoginUserWebModel.cs deleted file mode 100644 index 0f4ef73..0000000 --- a/ExamTemplate/Web/Models/User/LoginUserWebModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace ExamTemplate.Web.Models.User -{ - public class LoginUserWebModel - { - [Required] - [MinLength(1)] - public string Username { get; set; } - - [Required] - [MinLength(1)] - public string Password { get; set; } - } -} diff --git a/ExamTemplate/Web/Models/User/RegisterUserWebModel.cs b/ExamTemplate/Web/Models/User/RegisterUserWebModel.cs deleted file mode 100644 index c443dd2..0000000 --- a/ExamTemplate/Web/Models/User/RegisterUserWebModel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace ExamTemplate.Web.Models.User -{ - public class RegisterUserWebModel - { - [Required] - [MinLength(1)] - public string FirstName { get; set; } - - [Required] - [MinLength(1)] - public string LastName { get; set; } - - [Required] - [MinLength(1)] - public string Username { get; set; } - - [Required] - [MinLength(3)] - public string Password { get; set; } - } -} diff --git a/ExamTemplate/Web/Models/User/UserWebModel.cs b/ExamTemplate/Web/Models/User/UserWebModel.cs deleted file mode 100644 index af8d6c7..0000000 --- a/ExamTemplate/Web/Models/User/UserWebModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace ExamTemplate.Web.Models.User -{ - public class UserWebModel - { - public string FirstName { get; set; } - public string LastName { get; set; } - public string Username { get; set; } - } -} diff --git a/ExamTemplate/Web/Program.cs b/ExamTemplate/Web/Program.cs deleted file mode 100644 index be33374..0000000 --- a/ExamTemplate/Web/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace ExamTemplate.Web -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} diff --git a/ExamTemplate/Web/Properties/launchSettings.json b/ExamTemplate/Web/Properties/launchSettings.json deleted file mode 100644 index 080115b..0000000 --- a/ExamTemplate/Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:36205", - "sslPort": 44322 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Web": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/ExamTemplate/Web/Startup.cs b/ExamTemplate/Web/Startup.cs deleted file mode 100644 index c18bca6..0000000 --- a/ExamTemplate/Web/Startup.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Linq; -using ExamTemplate.Common; -using ExamTemplate.Data; -using ExamTemplate.Data.Models; -using ExamTemplate.Services.Services; -using ExamTemplate.Services.Interfaces; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace ExamTemplate.Web -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddControllersWithViews(); - services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); - - /* - * Dependency Injection configuration - */ - - services.AddTransient(options => - new CloudinaryService( - cloudName: this.Configuration.GetSection("Cloud").GetSection("cloudName").Value, - apiKey: this.Configuration.GetSection("Cloud").GetSection("apiKey").Value, - apiSecret: this.Configuration.GetSection("Cloud").GetSection("apiSecret").Value)); - services.AddTransient(); - - /* - * Database configuration - */ - - services.AddDbContext(options => - options.UseNpgsql(this.Configuration.GetConnectionString("LocalDBConnection"))); - - // Needed for SignInManager and UserManager - services.AddIdentity>(options => - { - options.SignIn.RequireConfirmedAccount = false; - - // Password settings - options.Password.RequireDigit = false; - options.Password.RequireLowercase = false; - options.Password.RequireNonAlphanumeric = false; - options.Password.RequireUppercase = false; - options.Password.RequiredLength = 3; - options.Password.RequiredUniqueChars = 0; - }).AddRoles>() - .AddEntityFrameworkStores(); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Home/Error"); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); - } - - app.UseStaticFiles(); - - app.UseRouting(); - - app.UseAuthentication(); - app.UseAuthorization(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllerRoute( - name: "default", - pattern: "{controller=Home}/{action=Index}/{id?}"); - endpoints.MapFallbackToController("ErrorNotFound", "Home"); - }); - - /* - * Make sure that the database is migrated - * and that the User and Admin role exist in database - */ - - using var serviceScope = app.ApplicationServices.CreateScope(); - using var dbContext = serviceScope.ServiceProvider.GetRequiredService(); - - dbContext.Database.Migrate(); - - var roleManager = (RoleManager>)serviceScope.ServiceProvider.GetService(typeof(RoleManager>)); - foreach (string name in RoleConst.GetAllNames()) - { - if (!dbContext.Roles.Any(x => x.Name == name)) - { - IdentityRole role = new IdentityRole() { Name = name }; - roleManager.CreateAsync(role).Wait(); - } - } - - /* If you want to create some custom database values at startup - * uncomment the following code - * and replace OBJCONST_ with your static class with constants (e.g. RoleConst) - * replace OBJS_ with the name of the DbSet of your database model (e.g. Roles) - * replace OBJ_ with the name of your database model (e.g. Role) - - foreach (string name in OBJCONST_.GetAllNames()) - { - if (!dbContext.OBJS_.Any(x => x.Name == name)) - { - var entity = new OBJ_() { Id = Guid.NewGuid(), Name = name }; - dbContext.OBJS_.Add(entity); - dbContext.SaveChanges(); - } - } - */ - } - } -} diff --git a/ExamTemplate/Web/Views/Account/Edit.cshtml b/ExamTemplate/Web/Views/Account/Edit.cshtml deleted file mode 100644 index a088742..0000000 --- a/ExamTemplate/Web/Views/Account/Edit.cshtml +++ /dev/null @@ -1,20 +0,0 @@ -@model EditUserWebModel -@{ - ViewData["Title"] = "Edit Profile"; -} - -
- - - - - - - - - - - - - -
diff --git a/ExamTemplate/Web/Views/Account/Login.cshtml b/ExamTemplate/Web/Views/Account/Login.cshtml deleted file mode 100644 index daa3f3e..0000000 --- a/ExamTemplate/Web/Views/Account/Login.cshtml +++ /dev/null @@ -1,23 +0,0 @@ -@model LoginUserWebModel -@{ - ViewData["Title"] = "Login"; -} - -
- - - - - - - - - @if (Model != null) - { -

- Invalid credentials or account doesn't exist! -

- } -
- - diff --git a/ExamTemplate/Web/Views/Account/Profile.cshtml b/ExamTemplate/Web/Views/Account/Profile.cshtml deleted file mode 100644 index 33fc882..0000000 --- a/ExamTemplate/Web/Views/Account/Profile.cshtml +++ /dev/null @@ -1,33 +0,0 @@ -@using Microsoft.AspNetCore.Identity - -@inject SignInManager SignInManager -@inject UserManager UserManager - -@model UserWebModel -@{ - ViewData["Title"] = Model.Username + "'s Profile"; -} - -

-

- @Model.FirstName @Model.LastName -

-
- @Model.Username -
- @if (SignInManager.IsSignedIn(User)) - { - @if(UserManager.GetUserName(User) == Model.Username) - { -
- -
- -
- -
- -
- } - } -

diff --git a/ExamTemplate/Web/Views/Account/Register.cshtml b/ExamTemplate/Web/Views/Account/Register.cshtml deleted file mode 100644 index e436d72..0000000 --- a/ExamTemplate/Web/Views/Account/Register.cshtml +++ /dev/null @@ -1,27 +0,0 @@ -@model RegisterUserWebModel -@{ - ViewData["Title"] = "Register"; -} - -
- - - - - - - - - - - - - - - @if (Model != null) - { -

- Couldn't register account! -

- } -
diff --git a/ExamTemplate/Web/Views/Home/Index.cshtml b/ExamTemplate/Web/Views/Home/Index.cshtml deleted file mode 100644 index 56ea950..0000000 --- a/ExamTemplate/Web/Views/Home/Index.cshtml +++ /dev/null @@ -1,8 +0,0 @@ -@{ - ViewData["Title"] = "Home"; -} - -
-

Welcome

-

Learn about building Web apps with ASP.NET Core.

-
diff --git a/ExamTemplate/Web/Views/Shared/Error.cshtml b/ExamTemplate/Web/Views/Shared/Error.cshtml deleted file mode 100644 index 5a7ce95..0000000 --- a/ExamTemplate/Web/Views/Shared/Error.cshtml +++ /dev/null @@ -1,25 +0,0 @@ -@model ErrorViewModel -@{ - ViewData["Title"] = "Error"; -} - -

Error.

-

An error occurred while processing your request.

- -@if (Model.ShowRequestId) -{ -

- Request ID: @Model.RequestId -

-} - -

Development Mode

-

- Swapping to Development environment will display more detailed information about the error that occurred. -

-

- The Development environment shouldn't be enabled for deployed applications. - It can result in displaying sensitive information from exceptions to end users. - For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development - and restarting the app. -

diff --git a/ExamTemplate/Web/Views/Shared/ErrorNotFound.cshtml b/ExamTemplate/Web/Views/Shared/ErrorNotFound.cshtml deleted file mode 100644 index 39fc5ca..0000000 --- a/ExamTemplate/Web/Views/Shared/ErrorNotFound.cshtml +++ /dev/null @@ -1,10 +0,0 @@ -@{ - ViewData["Title"] = "404: Not found!"; -} - -

- 404: Not found! -

-

- The page you're looking for couldn't be found! -

diff --git a/ExamTemplate/Web/Views/Shared/_FooterContent.cshtml b/ExamTemplate/Web/Views/Shared/_FooterContent.cshtml deleted file mode 100644 index 60a21aa..0000000 --- a/ExamTemplate/Web/Views/Shared/_FooterContent.cshtml +++ /dev/null @@ -1,8 +0,0 @@ -
- -
diff --git a/ExamTemplate/Web/Views/Shared/_Layout.cshtml b/ExamTemplate/Web/Views/Shared/_Layout.cshtml deleted file mode 100644 index dd7bf82..0000000 --- a/ExamTemplate/Web/Views/Shared/_Layout.cshtml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - @ViewData["Title"] - - - - -
- -
- -
-
- @RenderBody() -
-
- -
- -
- - diff --git a/ExamTemplate/Web/Views/Shared/_Navbar.cshtml b/ExamTemplate/Web/Views/Shared/_Navbar.cshtml deleted file mode 100644 index 0ec5c4d..0000000 --- a/ExamTemplate/Web/Views/Shared/_Navbar.cshtml +++ /dev/null @@ -1,31 +0,0 @@ -@using Microsoft.AspNetCore.Identity - -@inject SignInManager SignInManager -@inject UserManager UserManager - - diff --git a/ExamTemplate/Web/Views/_ViewImports.cshtml b/ExamTemplate/Web/Views/_ViewImports.cshtml deleted file mode 100644 index 18502e4..0000000 --- a/ExamTemplate/Web/Views/_ViewImports.cshtml +++ /dev/null @@ -1,5 +0,0 @@ -@using ExamTemplate.Web -@using ExamTemplate.Web.Models -@using ExamTemplate.Web.Models.User -@using ExamTemplate.Data.Models -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/ExamTemplate/Web/Views/_ViewStart.cshtml b/ExamTemplate/Web/Views/_ViewStart.cshtml deleted file mode 100644 index 3a04d05..0000000 --- a/ExamTemplate/Web/Views/_ViewStart.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@{ - Layout = "_Layout"; -} diff --git a/ExamTemplate/Web/Web.csproj b/ExamTemplate/Web/Web.csproj deleted file mode 100644 index 44c6a7a..0000000 --- a/ExamTemplate/Web/Web.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - net5.0 - - - diff --git a/ExamTemplate/Web/appsettings.json b/ExamTemplate/Web/appsettings.json deleted file mode 100644 index f1b58be..0000000 --- a/ExamTemplate/Web/appsettings.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "ConnectionStrings": { - "LocalDBConnection": "Server=localhost;Port=5432;Database=TemplateContext;User Id=;Password=;" - }, - "Cloud": { - "cloudName": "ExamTemplate", - "apiKey": "", - "apiSecret": "" - }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "AllowedHosts": "*" -} diff --git a/ExamTemplate/Web/wwwroot/css/site.css b/ExamTemplate/Web/wwwroot/css/site.css deleted file mode 100644 index 5923427..0000000 --- a/ExamTemplate/Web/wwwroot/css/site.css +++ /dev/null @@ -1,79 +0,0 @@ -/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification -for details on configuring this project to bundle and minify static web assets. */ - -a.navbar-brand { - white-space: normal; - text-align: center; - word-break: break-all; -} - -/* Provide sufficient contrast against white background */ -a { - color: #0366d6; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.nav-pills .nav-link.active, .nav-pills .show > .nav-link { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -/* Sticky footer styles --------------------------------------------------- */ -html { - font-size: 14px; -} -@media (min-width: 768px) { - html { - font-size: 16px; - } -} - -.border-top { - border-top: 1px solid #e5e5e5; -} -.border-bottom { - border-bottom: 1px solid #e5e5e5; -} - -.box-shadow { - box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); -} - -button.accept-policy { - font-size: 1rem; - line-height: inherit; -} - -/* Sticky footer styles --------------------------------------------------- */ -html { - position: relative; - min-height: 100%; - line-height: 1.15; -} - -body { - min-height: 100vh; - margin: 0; - font-size: 1.15em; - background-color: white; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -} - -/* The following is kinda dirty, that's why it's separated */ - -body { - display: flex; - flex-direction: column; -} - -body > main { - flex: 1; -} diff --git a/ExamTemplate/Web/wwwroot/css/styles.css b/ExamTemplate/Web/wwwroot/css/styles.css deleted file mode 100644 index e7fc7b3..0000000 --- a/ExamTemplate/Web/wwwroot/css/styles.css +++ /dev/null @@ -1,143 +0,0 @@ - -/* Change the maximum width of content (stuff inside pages and navbar), - * depending on width of browser window. - * Configuration copied from default Bootstrap - */ - -@media (min-width: 576px) { - :root { - --max-content-width: 540px; - } -} - -@media (min-width: 768px) { - :root { - --max-content-width: 720px; - } -} - -@media (min-width: 992px) { - :root { - --max-content-width: 960px; - } -} - -@media (min-width: 1200px) { - :root { - --max-content-width: 1140px; - } -} - -/* Main */ - -.main { - width: 100%; - height: 100%; -} - - /* Stuff that you need in the middle portion - * of the screen (like the stuff inside the - * navbar and footer) should be inside - * an element with this tag - */ -.middle-content-container { - max-width: var(--max-content-width); - margin-left: auto; - margin-right: auto; -} - -/* Navbar and footer */ - -.navbar, .footer-content { - width: 100%; - min-height: 45px; - - padding-top: 8px; - padding-bottom: 8px; - - display: flex; - align-items: center; - justify-content: center; -} - -.navbar section > :not(*:first-child) { - padding-left: 5px; -} - -.navbar section > :not(*:last-child) { - padding-right: 5px; -} - -.navbar a { - text-decoration: none; - color: #343a40; -} - -.navbar a:hover { - color: black; -} - -.navbar-contents { - width: 100%; - display: flex; - box-sizing: border-box; -} - -.navbar-contents > * { - display: flex; - align-items: center; - justify-content: center; -} - -/* Forms */ - -form { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: fit-content; -} - -.main > div > form { - margin-top: 10px; -} - -.main > div > form:first-child { - width: 100%; - max-width: 300px; - margin-left: auto; - margin-right: auto; -} - -form > * { - width: 100%; - box-sizing: border-box; -} - -input { - margin: 5px; - padding: 9px; - border: 1px solid darkgrey; - border-radius: 4px; -} - -input[type="submit"] { - color: white; - background-color: black; -} - -input[type="submit"]:hover { - cursor: pointer; -} - -.form-error { - font-size: 0.8em; - color: red; -} - -/* Other general stuff */ - -.flex-spacer { - flex: 1; -} diff --git a/ExamTemplate/Web/wwwroot/favicon.ico b/ExamTemplate/Web/wwwroot/favicon.ico deleted file mode 100644 index a3a7999..0000000 Binary files a/ExamTemplate/Web/wwwroot/favicon.ico and /dev/null differ -- cgit v1.2.3 From 97ef7568ab088396a5fbb11787e309a81cf2e3af Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 16 May 2021 07:39:16 +0300 Subject: Fixed solution not being able to be built --- ExamTemplate/ExamTemplate.sln | 204 ++++++++++----------- .../Web/ExamTemplate.Web/ExamTemplate.Web.csproj | 4 +- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/ExamTemplate/ExamTemplate.sln b/ExamTemplate/ExamTemplate.sln index 249c0fe..1dc8d33 100644 --- a/ExamTemplate/ExamTemplate.sln +++ b/ExamTemplate/ExamTemplate.sln @@ -3,27 +3,27 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.6.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{2F58A03C-503A-4912-BF1D-DFFF130216C7}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{B111A251-61F2-4737-AC8C-553BD4C4375F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Common", "Common\ExamTemplate.Common\ExamTemplate.Common.csproj", "{20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Common", "Common\ExamTemplate.Common\ExamTemplate.Common.csproj", "{6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{D9C12024-427F-4932-A0DF-BC855919EB95}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{6915D897-20EC-44F0-BED2-0FD9A2F37786}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Data", "Data\ExamTemplate.Data\ExamTemplate.Data.csproj", "{EADFEE4F-C3F7-4826-865D-CEC88305C224}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Data", "Data\ExamTemplate.Data\ExamTemplate.Data.csproj", "{77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Models", "Data\ExamTemplate.Models\ExamTemplate.Models.csproj", "{B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Data.Models", "Data\ExamTemplate.Data.Models\ExamTemplate.Data.Models.csproj", "{6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{595C13E8-3295-4D1F-8154-258C50302233}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{9623FE1E-5B38-4DD5-96E1-00847C1AE386}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Models", "Services\ExamTemplate.Models\ExamTemplate.Models.csproj", "{51146FC9-8D89-4D68-A932-8ECEA224F024}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Services", "Services\ExamTemplate.Services\ExamTemplate.Services.csproj", "{9F37083F-F0FE-4488-9D5D-DA92FEAB003F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Services", "Services\ExamTemplate.Services\ExamTemplate.Services.csproj", "{010DCE68-373D-4E45-A220-6B3EA8A8C83A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Services.Models", "Services\ExamTemplate.Services.Models\ExamTemplate.Services.Models.csproj", "{DCA531EE-5E78-41E0-B167-81510D31F421}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web", "Web", "{E298F85E-443F-48F6-8218-A5BAEB3AAAA2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web", "Web", "{F538D286-9CCB-42E9-921B-AEE5252E5845}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Models", "Web\ExamTemplate.Models\ExamTemplate.Models.csproj", "{E316C321-2408-4AB6-B216-06A9779CE650}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Web", "Web\ExamTemplate.Web\ExamTemplate.Web.csproj", "{AE877E66-7E65-46D8-A604-C5D60FB62EA9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Web", "Web\ExamTemplate.Web\ExamTemplate.Web.csproj", "{5184499B-5F09-42F0-819C-4CD927A73C55}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamTemplate.Web.Models", "Web\ExamTemplate.Web.Models\ExamTemplate.Web.Models.csproj", "{199377D0-3918-41D1-942E-6EA8F84E8980}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -38,98 +38,98 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|x64.ActiveCfg = Debug|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|x64.Build.0 = Debug|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|x86.ActiveCfg = Debug|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Debug|x86.Build.0 = Debug|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|Any CPU.Build.0 = Release|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|x64.ActiveCfg = Release|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|x64.Build.0 = Release|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|x86.ActiveCfg = Release|Any CPU - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D}.Release|x86.Build.0 = Release|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|x64.ActiveCfg = Debug|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|x64.Build.0 = Debug|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|x86.ActiveCfg = Debug|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Debug|x86.Build.0 = Debug|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|Any CPU.Build.0 = Release|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|x64.ActiveCfg = Release|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|x64.Build.0 = Release|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|x86.ActiveCfg = Release|Any CPU - {EADFEE4F-C3F7-4826-865D-CEC88305C224}.Release|x86.Build.0 = Release|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|x64.ActiveCfg = Debug|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|x64.Build.0 = Debug|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|x86.ActiveCfg = Debug|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Debug|x86.Build.0 = Debug|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|Any CPU.Build.0 = Release|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|x64.ActiveCfg = Release|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|x64.Build.0 = Release|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|x86.ActiveCfg = Release|Any CPU - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8}.Release|x86.Build.0 = Release|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|Any CPU.Build.0 = Debug|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|x64.ActiveCfg = Debug|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|x64.Build.0 = Debug|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|x86.ActiveCfg = Debug|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Debug|x86.Build.0 = Debug|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|Any CPU.ActiveCfg = Release|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|Any CPU.Build.0 = Release|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|x64.ActiveCfg = Release|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|x64.Build.0 = Release|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|x86.ActiveCfg = Release|Any CPU - {51146FC9-8D89-4D68-A932-8ECEA224F024}.Release|x86.Build.0 = Release|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|x64.ActiveCfg = Debug|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|x64.Build.0 = Debug|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|x86.ActiveCfg = Debug|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Debug|x86.Build.0 = Debug|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|Any CPU.Build.0 = Release|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|x64.ActiveCfg = Release|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|x64.Build.0 = Release|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|x86.ActiveCfg = Release|Any CPU - {010DCE68-373D-4E45-A220-6B3EA8A8C83A}.Release|x86.Build.0 = Release|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|x64.ActiveCfg = Debug|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|x64.Build.0 = Debug|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|x86.ActiveCfg = Debug|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Debug|x86.Build.0 = Debug|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Release|Any CPU.Build.0 = Release|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Release|x64.ActiveCfg = Release|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Release|x64.Build.0 = Release|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Release|x86.ActiveCfg = Release|Any CPU - {E316C321-2408-4AB6-B216-06A9779CE650}.Release|x86.Build.0 = Release|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|x64.ActiveCfg = Debug|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|x64.Build.0 = Debug|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|x86.ActiveCfg = Debug|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Debug|x86.Build.0 = Debug|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|Any CPU.Build.0 = Release|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|x64.ActiveCfg = Release|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|x64.Build.0 = Release|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|x86.ActiveCfg = Release|Any CPU - {5184499B-5F09-42F0-819C-4CD927A73C55}.Release|x86.Build.0 = Release|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Debug|x64.ActiveCfg = Debug|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Debug|x64.Build.0 = Debug|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Debug|x86.ActiveCfg = Debug|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Debug|x86.Build.0 = Debug|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Release|Any CPU.Build.0 = Release|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Release|x64.ActiveCfg = Release|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Release|x64.Build.0 = Release|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Release|x86.ActiveCfg = Release|Any CPU + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184}.Release|x86.Build.0 = Release|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Debug|x64.Build.0 = Debug|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Debug|x86.Build.0 = Debug|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Release|Any CPU.Build.0 = Release|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Release|x64.ActiveCfg = Release|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Release|x64.Build.0 = Release|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Release|x86.ActiveCfg = Release|Any CPU + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD}.Release|x86.Build.0 = Release|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Debug|x64.ActiveCfg = Debug|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Debug|x64.Build.0 = Debug|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Debug|x86.ActiveCfg = Debug|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Debug|x86.Build.0 = Debug|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Release|Any CPU.Build.0 = Release|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Release|x64.ActiveCfg = Release|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Release|x64.Build.0 = Release|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Release|x86.ActiveCfg = Release|Any CPU + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957}.Release|x86.Build.0 = Release|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Debug|x64.ActiveCfg = Debug|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Debug|x64.Build.0 = Debug|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Debug|x86.ActiveCfg = Debug|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Debug|x86.Build.0 = Debug|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Release|Any CPU.Build.0 = Release|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Release|x64.ActiveCfg = Release|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Release|x64.Build.0 = Release|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Release|x86.ActiveCfg = Release|Any CPU + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F}.Release|x86.Build.0 = Release|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Debug|x64.ActiveCfg = Debug|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Debug|x64.Build.0 = Debug|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Debug|x86.ActiveCfg = Debug|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Debug|x86.Build.0 = Debug|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Release|Any CPU.Build.0 = Release|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Release|x64.ActiveCfg = Release|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Release|x64.Build.0 = Release|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Release|x86.ActiveCfg = Release|Any CPU + {DCA531EE-5E78-41E0-B167-81510D31F421}.Release|x86.Build.0 = Release|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Debug|x64.ActiveCfg = Debug|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Debug|x64.Build.0 = Debug|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Debug|x86.ActiveCfg = Debug|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Debug|x86.Build.0 = Debug|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Release|Any CPU.Build.0 = Release|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Release|x64.ActiveCfg = Release|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Release|x64.Build.0 = Release|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Release|x86.ActiveCfg = Release|Any CPU + {AE877E66-7E65-46D8-A604-C5D60FB62EA9}.Release|x86.Build.0 = Release|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Debug|Any CPU.Build.0 = Debug|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Debug|x64.ActiveCfg = Debug|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Debug|x64.Build.0 = Debug|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Debug|x86.ActiveCfg = Debug|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Debug|x86.Build.0 = Debug|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Release|Any CPU.ActiveCfg = Release|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Release|Any CPU.Build.0 = Release|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Release|x64.ActiveCfg = Release|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Release|x64.Build.0 = Release|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Release|x86.ActiveCfg = Release|Any CPU + {199377D0-3918-41D1-942E-6EA8F84E8980}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution - {20BE6F45-CA5D-484B-B48C-D3DFA10B8B0D} = {2F58A03C-503A-4912-BF1D-DFFF130216C7} - {EADFEE4F-C3F7-4826-865D-CEC88305C224} = {D9C12024-427F-4932-A0DF-BC855919EB95} - {B5AB51F6-0807-4853-8B70-4CF56EFBF2E8} = {D9C12024-427F-4932-A0DF-BC855919EB95} - {51146FC9-8D89-4D68-A932-8ECEA224F024} = {595C13E8-3295-4D1F-8154-258C50302233} - {010DCE68-373D-4E45-A220-6B3EA8A8C83A} = {595C13E8-3295-4D1F-8154-258C50302233} - {E316C321-2408-4AB6-B216-06A9779CE650} = {E298F85E-443F-48F6-8218-A5BAEB3AAAA2} - {5184499B-5F09-42F0-819C-4CD927A73C55} = {E298F85E-443F-48F6-8218-A5BAEB3AAAA2} + {6ED9F9D8-E02F-4516-8719-A6C9E4A4B184} = {B111A251-61F2-4737-AC8C-553BD4C4375F} + {77885AAB-EF5B-4565-BB6B-800C7CCFD3AD} = {6915D897-20EC-44F0-BED2-0FD9A2F37786} + {6A03BA8B-06ED-4EE6-AB0C-E03AF4793957} = {6915D897-20EC-44F0-BED2-0FD9A2F37786} + {9F37083F-F0FE-4488-9D5D-DA92FEAB003F} = {9623FE1E-5B38-4DD5-96E1-00847C1AE386} + {DCA531EE-5E78-41E0-B167-81510D31F421} = {9623FE1E-5B38-4DD5-96E1-00847C1AE386} + {AE877E66-7E65-46D8-A604-C5D60FB62EA9} = {F538D286-9CCB-42E9-921B-AEE5252E5845} + {199377D0-3918-41D1-942E-6EA8F84E8980} = {F538D286-9CCB-42E9-921B-AEE5252E5845} EndGlobalSection EndGlobal diff --git a/ExamTemplate/Web/ExamTemplate.Web/ExamTemplate.Web.csproj b/ExamTemplate/Web/ExamTemplate.Web/ExamTemplate.Web.csproj index d2c2de4..b3e1542 100644 --- a/ExamTemplate/Web/ExamTemplate.Web/ExamTemplate.Web.csproj +++ b/ExamTemplate/Web/ExamTemplate.Web/ExamTemplate.Web.csproj @@ -1,4 +1,4 @@ - + @@ -10,7 +10,7 @@ - + -- cgit v1.2.3 From 58464468bb18b0bdc2e087ef52664bb5653d3d4e Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 16 May 2021 07:48:29 +0300 Subject: Fixed add feature and delete feature scripts --- tools/add-feature-template.sh | 24 ++++++++++++------------ tools/delete-feature-template.sh | 22 +++++++++++----------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/tools/add-feature-template.sh b/tools/add-feature-template.sh index 3b11a44..9637384 100755 --- a/tools/add-feature-template.sh +++ b/tools/add-feature-template.sh @@ -32,7 +32,7 @@ dir="../$project_name/Data" # {{{ ---------------------------> # Create the DB model class -cat > $dir/Models/$feature_name.cs<< EOF +cat > $dir/${project_name}.Data.Models/$feature_name.cs<< EOF using System; namespace $project_name.Data.Models @@ -55,7 +55,7 @@ EOF dbset="public DbSet<$feature_name> ${feature_name}s { get; set; }" -dbcontext_path="$dir/${project_name}Context.cs" +dbcontext_path="$dir/${project_name}.Data/${project_name}Context.cs" if ! grep -q "$dbset" "$dbcontext_path"; then if grep -Fq "DbSet" $dbcontext_path; then @@ -77,7 +77,7 @@ dir="../$project_name/Services" # {{{ ---------------------------> # Create Service and Interface -cat > $dir/Interfaces/I${feature_name}Service.cs<< EOF +cat > $dir/${project_name}.Services/Interfaces/I${feature_name}Service.cs<< EOF using $project_name.Data.Models; using $project_name.Services.Models.$feature_name; @@ -88,7 +88,7 @@ namespace $project_name.Services.Interfaces } EOF -cat > $dir/Services/${feature_name}Service.cs<< EOF +cat > $dir/${project_name}.Services/Services/${feature_name}Service.cs<< EOF using $project_name.Services.Interfaces; using System; using AutoMapper; @@ -112,7 +112,7 @@ EOF # {{{ ---------------------------> # Create Service Model -subdir="$dir/Models/$feature_name" +subdir="$dir/${project_name}.Services.Models/$feature_name" mkdir -p $subdir cat > $subdir/$model${feature_name}ServiceModel.cs<< EOF @@ -137,7 +137,7 @@ EOF # {{{ ---------------------------> # Create Service Mappings -subdir="${dir}/Configurations" +subdir="$dir/${project_name}.Services/Configurations" mappings=("${feature_name}ServiceModel, $feature_name" "${feature_name}, ${feature_name}ServiceModel") cat > $subdir/Service${feature_name}Mappings.cs<< EOF @@ -173,7 +173,7 @@ dir="../$project_name/Web" # {{{ ---------------------------> # Add the dependency injection of the Service class -startup_path="$dir/Startup.cs" +startup_path="$dir/${project_name}.Web/Startup.cs" service_name="${feature_name}Service" if ! grep -q "$service_name" "$startup_path"; then sed -z -i "s/.*AddTransient[^\n]*\n/&\t\t\tservices.AddTransient();\n/" $startup_path @@ -184,7 +184,7 @@ fi # {{{ ---------------------------> # Create View Models -subdir="$dir/Models/$feature_name" +subdir="$dir/${project_name}.Web.Models/$feature_name" mkdir -p $subdir models=("" "Create" "Edit") @@ -220,7 +220,7 @@ done # {{{ ---------------------------> # Update View Imports -viewimports_path="$dir/Views/_ViewImports.cshtml" +viewimports_path="$dir/${project_name}.Web/Views/_ViewImports.cshtml" import_name="$project_name.Web.Models.$feature_name" if ! grep -q "$import_name" "$viewimports_path"; then sed -z -i "s/.*@using[^\n]*\n/&@using $import_name\n/" $viewimports_path @@ -231,7 +231,7 @@ fi # {{{ ---------------------------> # Create Views -subdir="$dir/Views/$feature_name" +subdir="$dir/${project_name}.Web/Views/$feature_name" mkdir -p $subdir cat > $subdir/Index.cshtml<< EOF @@ -342,7 +342,7 @@ EOF # {{{ ---------------------------> # Create Controller -subdir="$dir/Controllers" +subdir="$dir/${project_name}.Web/Controllers" cat > $subdir/${feature_name}Controller.cs<< EOF using System; @@ -461,7 +461,7 @@ EOF # {{{ ---------------------------> # Create Controller Mappings -subdir="${dir}/Configurations" +subdir="${dir}/${project_name}.Web/Configurations" mappings=("${feature_name}ServiceModel, ${feature_name}WebModel" "Create${feature_name}WebModel, ${feature_name}ServiceModel" "${feature_name}ServiceModel, Edit${feature_name}WebModel" "Edit${feature_name}WebModel, ${feature_name}ServiceModel") cat > $subdir/Controller${feature_name}Mappings.cs<< EOF diff --git a/tools/delete-feature-template.sh b/tools/delete-feature-template.sh index 29484dd..5290c6c 100755 --- a/tools/delete-feature-template.sh +++ b/tools/delete-feature-template.sh @@ -24,8 +24,8 @@ feature_name="$2" dir="../$project_name/Data" -rm -f $dir/Models/$feature_name.cs -sed -i "/$feature_name/d" $dir/${project_name}Context.cs +rm -f $dir/${project_name}.Data.Models/$feature_name.cs +sed -i "/$feature_name/d" $dir/${project_name}.Data/${project_name}Context.cs # }}} =============================< @@ -34,9 +34,9 @@ sed -i "/$feature_name/d" $dir/${project_name}Context.cs dir="../$project_name/Services" -rm -f $dir/Configurations/Service${feature_name}Mappings.cs -rm -rf $dir/Models/$feature_name -rm -f $dir/${feature_name}Service.cs +rm -f $dir/${project_name}.Services/Configurations/Service${feature_name}Mappings.cs +rm -rf $dir/${project_name}.Services.Models/$feature_name +rm -f $dir/${project_name}.Services/${feature_name}Service.cs # }}} =============================< @@ -45,11 +45,11 @@ rm -f $dir/${feature_name}Service.cs dir="../$project_name/Web" -rm -f $dir/Configurations/Controller${feature_name}Mappings.cs -rm -f $dir/Controllers/${feature_name}Controller.cs -rm -rf $dir/Models/$feature_name -rm -rf $dir/Views/$feature_name -sed -i "/$feature_name/d" $dir/Views/_ViewImports.cshtml -sed -i "/$feature_name/d" $dir/Startup.cs +rm -f $dir/${project_name}.Web/Configurations/Controller${feature_name}Mappings.cs +rm -f $dir/${project_name}.Web/Controllers/${feature_name}Controller.cs +rm -rf $dir/${project_name}.Web.Models/$feature_name +rm -rf $dir/${project_name}.Web/Views/$feature_name +sed -i "/$feature_name/d" $dir/${project_name}.Web/Views/_ViewImports.cshtml +sed -i "/$feature_name/d" $dir/${project_name}.Web/Startup.cs # }}} =============================< -- cgit v1.2.3 From aa909217505edb4459275b38182b6961f07e352c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 16 May 2021 08:04:28 +0300 Subject: Fixed project rename --- tools/rename-project.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/rename-project.sh b/tools/rename-project.sh index b0d6d0b..722650a 100755 --- a/tools/rename-project.sh +++ b/tools/rename-project.sh @@ -34,12 +34,14 @@ rename () { done } +mv ../$original_name ../$new_name + # Rename all directories and then files -rename $(find ../ -type d -name "*$original_name*") -rename $(find ../ -type f -name "*$original_name*") +rename $(find ../$new_name -type d -name "*$original_name*") +rename $(find ../$new_name -type f -name "*$original_name*") # Rename all occurences inside files -find ../ -type f -not -path "../tools/*" -not -path "../.git/*" -print0 | xargs -0 sed -i "s/$original_name/$new_name/g" +find ../$new_name -type f -not -path "../tools/*" -not -path "../.git/*" -print0 | xargs -0 sed -i "s/$original_name/$new_name/g" # The database context is named TemplateContext by default # A third paramter should never be given, the second check is to prevent stack overflow -- cgit v1.2.3 From 564209043493c77fd51ac096b5a160bb20c46f12 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 16 May 2021 08:11:24 +0300 Subject: Fixed tempalte context factory --- ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs b/ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs index dff2e9e..8b2c0fa 100644 --- a/ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs +++ b/ExamTemplate/Data/ExamTemplate.Data/TemplateContextFactory.cs @@ -10,7 +10,7 @@ namespace ExamTemplate.Data public TemplateContext CreateDbContext(string[] args) { var configuration = new ConfigurationBuilder() - .SetBasePath(Directory.GetCurrentDirectory() + "/../Web/") + .SetBasePath(Directory.GetCurrentDirectory() + "/../../Web/CarShop.Web/") .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile("appsettings.Development.json", optional: true) .Build(); -- cgit v1.2.3