149 changed files with 3066 additions and 1050 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,13 +1,13 @@ |
|||||
<Project Sdk="Microsoft.NET.Sdk"> |
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
<PropertyGroup> |
<PropertyGroup> |
||||
<TargetFramework>netstandard2.0</TargetFramework> |
<TargetFramework>netstandard2.0</TargetFramework> |
||||
<RootNamespace>Microsoft.eShopWeb.ApplicationCore</RootNamespace> |
<RootNamespace>Microsoft.eShopWeb.ApplicationCore</RootNamespace> |
||||
</PropertyGroup> |
</PropertyGroup> |
||||
|
|
||||
<ItemGroup> |
<ItemGroup> |
||||
<PackageReference Include="Ardalis.GuardClauses" Version="1.2.3" /> |
<PackageReference Include="Ardalis.GuardClauses" Version="1.2.3" /> |
||||
<PackageReference Include="System.Security.Claims" Version="4.3.0" /> |
<PackageReference Include="System.Security.Claims" Version="4.3.0" /> |
||||
</ItemGroup> |
</ItemGroup> |
||||
|
|
||||
</Project> |
</Project> |
||||
@ -0,0 +1,14 @@ |
|||||
|
using Microsoft.eShopWeb.ApplicationCore.Entities; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.ApplicationCore.Specifications |
||||
|
{ |
||||
|
public class CatalogFilterPaginatedSpecification : BaseSpecification<CatalogItem> |
||||
|
{ |
||||
|
public CatalogFilterPaginatedSpecification(int skip, int take, int? brandId, int? typeId) |
||||
|
: base(i => (!brandId.HasValue || i.CatalogBrandId == brandId) && |
||||
|
(!typeId.HasValue || i.CatalogTypeId == typeId)) |
||||
|
{ |
||||
|
ApplyPaging(skip, take); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,50 @@ |
|||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Entities; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Infrastructure.Data |
||||
|
{ |
||||
|
public class SpecificationEvaluator<T> where T : BaseEntity |
||||
|
{ |
||||
|
public static IQueryable<T> GetQuery(IQueryable<T> inputQuery, ISpecification<T> specification) |
||||
|
{ |
||||
|
var query = inputQuery; |
||||
|
|
||||
|
// modify the IQueryable using the specification's criteria expression
|
||||
|
if (specification.Criteria != null) |
||||
|
{ |
||||
|
query = query.Where(specification.Criteria); |
||||
|
} |
||||
|
|
||||
|
// Includes all expression-based includes
|
||||
|
query = specification.Includes.Aggregate(query, |
||||
|
(current, include) => current.Include(include)); |
||||
|
|
||||
|
// Include any string-based include statements
|
||||
|
query = specification.IncludeStrings.Aggregate(query, |
||||
|
(current, include) => current.Include(include)); |
||||
|
|
||||
|
// Apply ordering if expressions are set
|
||||
|
if (specification.OrderBy != null) |
||||
|
{ |
||||
|
query = query.OrderBy(specification.OrderBy); |
||||
|
} |
||||
|
else if (specification.OrderByDescending != null) |
||||
|
{ |
||||
|
query = query.OrderByDescending(specification.OrderByDescending); |
||||
|
} |
||||
|
|
||||
|
// Apply paging if enabled
|
||||
|
if (specification.isPagingEnabled) |
||||
|
{ |
||||
|
query = query.Skip(specification.Skip) |
||||
|
.Take(specification.Take); |
||||
|
} |
||||
|
return query; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,20 +1,20 @@ |
|||||
<Project Sdk="Microsoft.NET.Sdk"> |
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
<PropertyGroup> |
<PropertyGroup> |
||||
<TargetFramework>netstandard2.0</TargetFramework> |
<TargetFramework>netstandard2.0</TargetFramework> |
||||
<RootNamespace>Microsoft.eShopWeb.Infrastructure</RootNamespace> |
<RootNamespace>Microsoft.eShopWeb.Infrastructure</RootNamespace> |
||||
</PropertyGroup> |
</PropertyGroup> |
||||
|
|
||||
<ItemGroup> |
<ItemGroup> |
||||
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.1.0" /> |
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.1.3" /> |
||||
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.1.0" /> |
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.1.3" /> |
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.0" /> |
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.2" /> |
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.0" PrivateAssets="All" /> |
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.2" PrivateAssets="All" /> |
||||
</ItemGroup> |
</ItemGroup> |
||||
<ItemGroup> |
<ItemGroup> |
||||
<ProjectReference Include="..\ApplicationCore\ApplicationCore.csproj" /> |
<ProjectReference Include="..\ApplicationCore\ApplicationCore.csproj" /> |
||||
</ItemGroup> |
</ItemGroup> |
||||
<ItemGroup> |
<ItemGroup> |
||||
<Folder Include="Data\Migrations\" /> |
<Folder Include="Data\Migrations\" /> |
||||
</ItemGroup> |
</ItemGroup> |
||||
</Project> |
</Project> |
||||
@ -1,3 +0,0 @@ |
|||||
{ |
|
||||
"directory": "wwwroot/lib" |
|
||||
} |
|
||||
@ -0,0 +1,3 @@ |
|||||
|
@{ |
||||
|
Layout = "/Views/Shared/_Layout.cshtml"; |
||||
|
} |
||||
@ -1,10 +1,9 @@ |
|||||
using Microsoft.eShopWeb.Web.Services; |
using Microsoft.AspNetCore.Mvc; |
||||
using Microsoft.AspNetCore.Mvc; |
|
||||
using System.Threading.Tasks; |
|
||||
|
|
||||
namespace Microsoft.eShopWeb.Web.Controllers.Api |
namespace Microsoft.eShopWeb.Web.Controllers.Api |
||||
{ |
{ |
||||
[Route("api/[controller]/[action]")]
|
[Route("api/[controller]/[action]")]
|
||||
|
[ApiController] |
||||
public class BaseApiController : Controller |
public class BaseApiController : Controller |
||||
{ } |
{ } |
||||
} |
} |
||||
|
|||||
@ -1,111 +0,0 @@ |
|||||
using Microsoft.AspNetCore.Mvc; |
|
||||
using System.Threading.Tasks; |
|
||||
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
|
||||
using Microsoft.AspNetCore.Http; |
|
||||
using Microsoft.eShopWeb.Web.ViewModels; |
|
||||
using Microsoft.AspNetCore.Identity; |
|
||||
using Microsoft.eShopWeb.Infrastructure.Identity; |
|
||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; |
|
||||
using Microsoft.AspNetCore.Authorization; |
|
||||
using Microsoft.eShopWeb.Web.Interfaces; |
|
||||
|
|
||||
namespace Microsoft.eShopWeb.Web.Controllers |
|
||||
{ |
|
||||
[Route("[controller]/[action]")]
|
|
||||
public class BasketController : Controller |
|
||||
{ |
|
||||
private readonly IBasketService _basketService; |
|
||||
private readonly IUriComposer _uriComposer; |
|
||||
private readonly SignInManager<ApplicationUser> _signInManager; |
|
||||
private readonly IAppLogger<BasketController> _logger; |
|
||||
private readonly IOrderService _orderService; |
|
||||
private readonly IBasketViewModelService _basketViewModelService; |
|
||||
|
|
||||
public BasketController(IBasketService basketService, |
|
||||
IBasketViewModelService basketViewModelService, |
|
||||
IOrderService orderService, |
|
||||
IUriComposer uriComposer, |
|
||||
SignInManager<ApplicationUser> signInManager, |
|
||||
IAppLogger<BasketController> logger) |
|
||||
{ |
|
||||
_basketService = basketService; |
|
||||
_uriComposer = uriComposer; |
|
||||
_signInManager = signInManager; |
|
||||
_logger = logger; |
|
||||
_orderService = orderService; |
|
||||
_basketViewModelService = basketViewModelService; |
|
||||
} |
|
||||
|
|
||||
[HttpGet] |
|
||||
public async Task<IActionResult> Index() |
|
||||
{ |
|
||||
var basketModel = await GetBasketViewModelAsync(); |
|
||||
|
|
||||
return View(basketModel); |
|
||||
} |
|
||||
|
|
||||
[HttpPost] |
|
||||
public async Task<IActionResult> Index(Dictionary<string, int> items) |
|
||||
{ |
|
||||
var basketViewModel = await GetBasketViewModelAsync(); |
|
||||
await _basketService.SetQuantities(basketViewModel.Id, items); |
|
||||
|
|
||||
return View(await GetBasketViewModelAsync()); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
// POST: /Basket/AddToBasket
|
|
||||
[HttpPost] |
|
||||
public async Task<IActionResult> AddToBasket(CatalogItemViewModel productDetails) |
|
||||
{ |
|
||||
if (productDetails?.Id == null) |
|
||||
{ |
|
||||
return RedirectToAction("Index", "Catalog"); |
|
||||
} |
|
||||
var basketViewModel = await GetBasketViewModelAsync(); |
|
||||
|
|
||||
await _basketService.AddItemToBasket(basketViewModel.Id, productDetails.Id, productDetails.Price, 1); |
|
||||
|
|
||||
return RedirectToAction("Index"); |
|
||||
} |
|
||||
|
|
||||
[HttpPost] |
|
||||
[Authorize] |
|
||||
public async Task<IActionResult> Checkout(Dictionary<string, int> items) |
|
||||
{ |
|
||||
var basketViewModel = await GetBasketViewModelAsync(); |
|
||||
await _basketService.SetQuantities(basketViewModel.Id, items); |
|
||||
|
|
||||
await _orderService.CreateOrderAsync(basketViewModel.Id, new Address("123 Main St.", "Kent", "OH", "United States", "44240")); |
|
||||
|
|
||||
await _basketService.DeleteBasketAsync(basketViewModel.Id); |
|
||||
|
|
||||
return View("Checkout"); |
|
||||
} |
|
||||
|
|
||||
private async Task<BasketViewModel> GetBasketViewModelAsync() |
|
||||
{ |
|
||||
if (_signInManager.IsSignedIn(HttpContext.User)) |
|
||||
{ |
|
||||
return await _basketViewModelService.GetOrCreateBasketForUser(User.Identity.Name); |
|
||||
} |
|
||||
string anonymousId = GetOrSetBasketCookie(); |
|
||||
return await _basketViewModelService.GetOrCreateBasketForUser(anonymousId); |
|
||||
} |
|
||||
|
|
||||
private string GetOrSetBasketCookie() |
|
||||
{ |
|
||||
if (Request.Cookies.ContainsKey(Constants.BASKET_COOKIENAME)) |
|
||||
{ |
|
||||
return Request.Cookies[Constants.BASKET_COOKIENAME]; |
|
||||
} |
|
||||
string anonymousId = Guid.NewGuid().ToString(); |
|
||||
var cookieOptions = new CookieOptions(); |
|
||||
cookieOptions.Expires = DateTime.Today.AddYears(10); |
|
||||
Response.Cookies.Append(Constants.BASKET_COOKIENAME, anonymousId, cookieOptions); |
|
||||
return anonymousId; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,29 +0,0 @@ |
|||||
using Microsoft.eShopWeb.Web.Services; |
|
||||
using Microsoft.AspNetCore.Mvc; |
|
||||
using System.Threading.Tasks; |
|
||||
|
|
||||
namespace Microsoft.eShopWeb.Web.Controllers |
|
||||
{ |
|
||||
[Route("")] |
|
||||
public class CatalogController : Controller |
|
||||
{ |
|
||||
private readonly ICatalogService _catalogService; |
|
||||
|
|
||||
public CatalogController(ICatalogService catalogService) => _catalogService = catalogService; |
|
||||
|
|
||||
[HttpGet] |
|
||||
[HttpPost] |
|
||||
public async Task<IActionResult> Index(int? brandFilterApplied, int? typesFilterApplied, int? page) |
|
||||
{ |
|
||||
var itemsPage = 10; |
|
||||
var catalogModel = await _catalogService.GetCatalogItems(page ?? 0, itemsPage, brandFilterApplied, typesFilterApplied); |
|
||||
return View(catalogModel); |
|
||||
} |
|
||||
|
|
||||
[HttpGet("Error")] |
|
||||
public IActionResult Error() |
|
||||
{ |
|
||||
return View(); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,16 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Text; |
||||
|
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
|
||||
|
namespace Web2.Data |
||||
|
{ |
||||
|
public class ApplicationDbContext : IdentityDbContext |
||||
|
{ |
||||
|
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) |
||||
|
: base(options) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,236 @@ |
|||||
|
// <auto-generated />
|
||||
|
using System; |
||||
|
using Web2.Data; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Infrastructure; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
||||
|
|
||||
|
namespace Web2.Data.Migrations |
||||
|
{ |
||||
|
[DbContext(typeof(ApplicationDbContext))] |
||||
|
[Migration("00000000000000_CreateIdentitySchema")] |
||||
|
partial class CreateIdentitySchema |
||||
|
{ |
||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
#pragma warning disable 612, 618
|
||||
|
modelBuilder |
||||
|
.HasAnnotation("ProductVersion", "2.2.0-preview1") |
||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => |
||||
|
{ |
||||
|
b.Property<string>("Id") |
||||
|
.ValueGeneratedOnAdd(); |
||||
|
|
||||
|
b.Property<string>("ConcurrencyStamp") |
||||
|
.IsConcurrencyToken(); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("NormalizedName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("NormalizedName") |
||||
|
.IsUnique() |
||||
|
.HasName("RoleNameIndex") |
||||
|
.HasFilter("[NormalizedName] IS NOT NULL"); |
||||
|
|
||||
|
b.ToTable("AspNetRoles"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => |
||||
|
{ |
||||
|
b.Property<int>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
b.Property<string>("ClaimType"); |
||||
|
|
||||
|
b.Property<string>("ClaimValue"); |
||||
|
|
||||
|
b.Property<string>("RoleId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("RoleId"); |
||||
|
|
||||
|
b.ToTable("AspNetRoleClaims"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => |
||||
|
{ |
||||
|
b.Property<string>("Id") |
||||
|
.ValueGeneratedOnAdd(); |
||||
|
|
||||
|
b.Property<int>("AccessFailedCount"); |
||||
|
|
||||
|
b.Property<string>("ConcurrencyStamp") |
||||
|
.IsConcurrencyToken(); |
||||
|
|
||||
|
b.Property<string>("Email") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<bool>("EmailConfirmed"); |
||||
|
|
||||
|
b.Property<bool>("LockoutEnabled"); |
||||
|
|
||||
|
b.Property<DateTimeOffset?>("LockoutEnd"); |
||||
|
|
||||
|
b.Property<string>("NormalizedEmail") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("NormalizedUserName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("PasswordHash"); |
||||
|
|
||||
|
b.Property<string>("PhoneNumber"); |
||||
|
|
||||
|
b.Property<bool>("PhoneNumberConfirmed"); |
||||
|
|
||||
|
b.Property<string>("SecurityStamp"); |
||||
|
|
||||
|
b.Property<bool>("TwoFactorEnabled"); |
||||
|
|
||||
|
b.Property<string>("UserName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("NormalizedEmail") |
||||
|
.HasName("EmailIndex"); |
||||
|
|
||||
|
b.HasIndex("NormalizedUserName") |
||||
|
.IsUnique() |
||||
|
.HasName("UserNameIndex") |
||||
|
.HasFilter("[NormalizedUserName] IS NOT NULL"); |
||||
|
|
||||
|
b.ToTable("AspNetUsers"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => |
||||
|
{ |
||||
|
b.Property<int>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
b.Property<string>("ClaimType"); |
||||
|
|
||||
|
b.Property<string>("ClaimValue"); |
||||
|
|
||||
|
b.Property<string>("UserId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("UserId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserClaims"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("LoginProvider") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("ProviderKey") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("ProviderDisplayName"); |
||||
|
|
||||
|
b.Property<string>("UserId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("LoginProvider", "ProviderKey"); |
||||
|
|
||||
|
b.HasIndex("UserId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserLogins"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("UserId"); |
||||
|
|
||||
|
b.Property<string>("RoleId"); |
||||
|
|
||||
|
b.HasKey("UserId", "RoleId"); |
||||
|
|
||||
|
b.HasIndex("RoleId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserRoles"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("UserId"); |
||||
|
|
||||
|
b.Property<string>("LoginProvider") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("Value"); |
||||
|
|
||||
|
b.HasKey("UserId", "LoginProvider", "Name"); |
||||
|
|
||||
|
b.ToTable("AspNetUserTokens"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("RoleId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("RoleId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
|
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
#pragma warning restore 612, 618
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,220 @@ |
|||||
|
using System; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
|
||||
|
namespace Web2.Data.Migrations |
||||
|
{ |
||||
|
public partial class CreateIdentitySchema : Migration |
||||
|
{ |
||||
|
protected override void Up(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "AspNetRoles", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<string>(nullable: false), |
||||
|
Name = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
NormalizedName = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
ConcurrencyStamp = table.Column<string>(nullable: true) |
||||
|
}, |
||||
|
constraints: table => |
||||
|
{ |
||||
|
table.PrimaryKey("PK_AspNetRoles", x => x.Id); |
||||
|
}); |
||||
|
|
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "AspNetUsers", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<string>(nullable: false), |
||||
|
UserName = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
NormalizedUserName = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
Email = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
NormalizedEmail = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
EmailConfirmed = table.Column<bool>(nullable: false), |
||||
|
PasswordHash = table.Column<string>(nullable: true), |
||||
|
SecurityStamp = table.Column<string>(nullable: true), |
||||
|
ConcurrencyStamp = table.Column<string>(nullable: true), |
||||
|
PhoneNumber = table.Column<string>(nullable: true), |
||||
|
PhoneNumberConfirmed = table.Column<bool>(nullable: false), |
||||
|
TwoFactorEnabled = table.Column<bool>(nullable: false), |
||||
|
LockoutEnd = table.Column<DateTimeOffset>(nullable: true), |
||||
|
LockoutEnabled = table.Column<bool>(nullable: false), |
||||
|
AccessFailedCount = table.Column<int>(nullable: false) |
||||
|
}, |
||||
|
constraints: table => |
||||
|
{ |
||||
|
table.PrimaryKey("PK_AspNetUsers", x => x.Id); |
||||
|
}); |
||||
|
|
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "AspNetRoleClaims", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<int>(nullable: false) |
||||
|
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), |
||||
|
RoleId = table.Column<string>(nullable: false), |
||||
|
ClaimType = table.Column<string>(nullable: true), |
||||
|
ClaimValue = table.Column<string>(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<int>(nullable: false) |
||||
|
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), |
||||
|
UserId = table.Column<string>(nullable: false), |
||||
|
ClaimType = table.Column<string>(nullable: true), |
||||
|
ClaimValue = table.Column<string>(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<string>(maxLength: 128, nullable: false), |
||||
|
ProviderKey = table.Column<string>(maxLength: 128, nullable: false), |
||||
|
ProviderDisplayName = table.Column<string>(nullable: true), |
||||
|
UserId = table.Column<string>(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<string>(nullable: false), |
||||
|
RoleId = table.Column<string>(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<string>(nullable: false), |
||||
|
LoginProvider = table.Column<string>(maxLength: 128, nullable: false), |
||||
|
Name = table.Column<string>(maxLength: 128, nullable: false), |
||||
|
Value = table.Column<string>(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.CreateIndex( |
||||
|
name: "IX_AspNetRoleClaims_RoleId", |
||||
|
table: "AspNetRoleClaims", |
||||
|
column: "RoleId"); |
||||
|
|
||||
|
migrationBuilder.CreateIndex( |
||||
|
name: "RoleNameIndex", |
||||
|
table: "AspNetRoles", |
||||
|
column: "NormalizedName", |
||||
|
unique: true, |
||||
|
filter: "[NormalizedName] IS NOT NULL"); |
||||
|
|
||||
|
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, |
||||
|
filter: "[NormalizedUserName] IS NOT NULL"); |
||||
|
} |
||||
|
|
||||
|
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: "AspNetRoles"); |
||||
|
|
||||
|
migrationBuilder.DropTable( |
||||
|
name: "AspNetUsers"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,234 @@ |
|||||
|
// <auto-generated />
|
||||
|
using System; |
||||
|
using Web2.Data; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Infrastructure; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
||||
|
|
||||
|
namespace Web2.Data.Migrations |
||||
|
{ |
||||
|
[DbContext(typeof(ApplicationDbContext))] |
||||
|
partial class ApplicationDbContextModelSnapshot : ModelSnapshot |
||||
|
{ |
||||
|
protected override void BuildModel(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
#pragma warning disable 612, 618
|
||||
|
modelBuilder |
||||
|
.HasAnnotation("ProductVersion", "2.2.0-preview1") |
||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => |
||||
|
{ |
||||
|
b.Property<string>("Id") |
||||
|
.ValueGeneratedOnAdd(); |
||||
|
|
||||
|
b.Property<string>("ConcurrencyStamp") |
||||
|
.IsConcurrencyToken(); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("NormalizedName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("NormalizedName") |
||||
|
.IsUnique() |
||||
|
.HasName("RoleNameIndex") |
||||
|
.HasFilter("[NormalizedName] IS NOT NULL"); |
||||
|
|
||||
|
b.ToTable("AspNetRoles"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => |
||||
|
{ |
||||
|
b.Property<int>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
b.Property<string>("ClaimType"); |
||||
|
|
||||
|
b.Property<string>("ClaimValue"); |
||||
|
|
||||
|
b.Property<string>("RoleId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("RoleId"); |
||||
|
|
||||
|
b.ToTable("AspNetRoleClaims"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => |
||||
|
{ |
||||
|
b.Property<string>("Id") |
||||
|
.ValueGeneratedOnAdd(); |
||||
|
|
||||
|
b.Property<int>("AccessFailedCount"); |
||||
|
|
||||
|
b.Property<string>("ConcurrencyStamp") |
||||
|
.IsConcurrencyToken(); |
||||
|
|
||||
|
b.Property<string>("Email") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<bool>("EmailConfirmed"); |
||||
|
|
||||
|
b.Property<bool>("LockoutEnabled"); |
||||
|
|
||||
|
b.Property<DateTimeOffset?>("LockoutEnd"); |
||||
|
|
||||
|
b.Property<string>("NormalizedEmail") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("NormalizedUserName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("PasswordHash"); |
||||
|
|
||||
|
b.Property<string>("PhoneNumber"); |
||||
|
|
||||
|
b.Property<bool>("PhoneNumberConfirmed"); |
||||
|
|
||||
|
b.Property<string>("SecurityStamp"); |
||||
|
|
||||
|
b.Property<bool>("TwoFactorEnabled"); |
||||
|
|
||||
|
b.Property<string>("UserName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("NormalizedEmail") |
||||
|
.HasName("EmailIndex"); |
||||
|
|
||||
|
b.HasIndex("NormalizedUserName") |
||||
|
.IsUnique() |
||||
|
.HasName("UserNameIndex") |
||||
|
.HasFilter("[NormalizedUserName] IS NOT NULL"); |
||||
|
|
||||
|
b.ToTable("AspNetUsers"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => |
||||
|
{ |
||||
|
b.Property<int>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
b.Property<string>("ClaimType"); |
||||
|
|
||||
|
b.Property<string>("ClaimValue"); |
||||
|
|
||||
|
b.Property<string>("UserId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("UserId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserClaims"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("LoginProvider") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("ProviderKey") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("ProviderDisplayName"); |
||||
|
|
||||
|
b.Property<string>("UserId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("LoginProvider", "ProviderKey"); |
||||
|
|
||||
|
b.HasIndex("UserId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserLogins"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("UserId"); |
||||
|
|
||||
|
b.Property<string>("RoleId"); |
||||
|
|
||||
|
b.HasKey("UserId", "RoleId"); |
||||
|
|
||||
|
b.HasIndex("RoleId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserRoles"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("UserId"); |
||||
|
|
||||
|
b.Property<string>("LoginProvider") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("Value"); |
||||
|
|
||||
|
b.HasKey("UserId", "LoginProvider", "Name"); |
||||
|
|
||||
|
b.ToTable("AspNetUserTokens"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("RoleId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("RoleId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
|
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
#pragma warning restore 612, 618
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,40 @@ |
|||||
|
using Microsoft.AspNetCore.Http; |
||||
|
using Microsoft.AspNetCore.Routing; |
||||
|
using Microsoft.Extensions.Diagnostics.HealthChecks; |
||||
|
using System.Net.Http; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.HealthChecks |
||||
|
{ |
||||
|
public class ApiHealthCheck : IHealthCheck |
||||
|
{ |
||||
|
private readonly IHttpContextAccessor _httpContextAccessor; |
||||
|
private readonly LinkGenerator _linkGenerator; |
||||
|
|
||||
|
public ApiHealthCheck(IHttpContextAccessor httpContextAccessor, LinkGenerator linkGenerator) |
||||
|
{ |
||||
|
_httpContextAccessor = httpContextAccessor; |
||||
|
_linkGenerator = linkGenerator; |
||||
|
} |
||||
|
|
||||
|
public async Task<HealthCheckResult> CheckHealthAsync( |
||||
|
HealthCheckContext context, |
||||
|
CancellationToken cancellationToken = default(CancellationToken)) |
||||
|
{ |
||||
|
var request = _httpContextAccessor.HttpContext.Request; |
||||
|
|
||||
|
string apiLink = _linkGenerator.GetPathByAction("List", "Catalog"); |
||||
|
string myUrl = request.Scheme + "://" + request.Host.ToString() + apiLink; |
||||
|
var client = new HttpClient(); |
||||
|
var response = await client.GetAsync(myUrl); |
||||
|
var pageContents = await response.Content.ReadAsStringAsync(); |
||||
|
if (pageContents.Contains(".NET Bot Black Sweatshirt")) |
||||
|
{ |
||||
|
return HealthCheckResult.Healthy("The check indicates a healthy result."); |
||||
|
} |
||||
|
|
||||
|
return HealthCheckResult.Unhealthy("The check indicates an unhealthy result."); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
using Microsoft.AspNetCore.Http; |
||||
|
using Microsoft.Extensions.Diagnostics.HealthChecks; |
||||
|
using System.Net.Http; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.HealthChecks |
||||
|
{ |
||||
|
public class HomePageHealthCheck : IHealthCheck |
||||
|
{ |
||||
|
private readonly IHttpContextAccessor _httpContextAccessor; |
||||
|
|
||||
|
public HomePageHealthCheck(IHttpContextAccessor httpContextAccessor) |
||||
|
{ |
||||
|
_httpContextAccessor = httpContextAccessor; |
||||
|
} |
||||
|
|
||||
|
public async Task<HealthCheckResult> CheckHealthAsync( |
||||
|
HealthCheckContext context, |
||||
|
CancellationToken cancellationToken = default(CancellationToken)) |
||||
|
{ |
||||
|
var request = _httpContextAccessor.HttpContext.Request; |
||||
|
string myUrl = request.Scheme + "://" + request.Host.ToString(); |
||||
|
|
||||
|
var client = new HttpClient(); |
||||
|
var response = await client.GetAsync(myUrl); |
||||
|
var pageContents = await response.Content.ReadAsStringAsync(); |
||||
|
if (pageContents.Contains(".NET Bot Black Sweatshirt")) |
||||
|
{ |
||||
|
return HealthCheckResult.Healthy("The check indicates a healthy result."); |
||||
|
} |
||||
|
|
||||
|
return HealthCheckResult.Unhealthy("The check indicates an unhealthy result."); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,4 +1,4 @@ |
|||||
using Microsoft.eShopWeb.Web.ViewModels; |
using Microsoft.eShopWeb.Web.Pages.Basket; |
||||
using System.Threading.Tasks; |
using System.Threading.Tasks; |
||||
|
|
||||
namespace Microsoft.eShopWeb.Web.Interfaces |
namespace Microsoft.eShopWeb.Web.Interfaces |
||||
@ -0,0 +1,11 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace Web2.Models |
||||
|
{ |
||||
|
public class ErrorViewModel |
||||
|
{ |
||||
|
public string RequestId { get; set; } |
||||
|
|
||||
|
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); |
||||
|
} |
||||
|
} |
||||
@ -1,4 +1,4 @@ |
|||||
namespace Microsoft.eShopWeb.Web.ViewModels |
namespace Microsoft.eShopWeb.Web.Pages.Basket |
||||
{ |
{ |
||||
public class BasketItemViewModel |
public class BasketItemViewModel |
||||
{ |
{ |
||||
@ -0,0 +1,16 @@ |
|||||
|
@page |
||||
|
@model CheckoutModel |
||||
|
@{ |
||||
|
ViewData["Title"] = "Checkout Complete"; |
||||
|
} |
||||
|
<section class="esh-catalog-hero"> |
||||
|
<div class="container"> |
||||
|
<img class="esh-catalog-title" src="~/images/main_banner_text.png" /> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<div class="container"> |
||||
|
<h1>Thanks for your Order!</h1> |
||||
|
|
||||
|
<a asp-page="/Index">Continue Shopping...</a> |
||||
|
</div> |
||||
@ -0,0 +1,83 @@ |
|||||
|
using Microsoft.AspNetCore.Http; |
||||
|
using Microsoft.AspNetCore.Identity; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
||||
|
using Microsoft.eShopWeb.Infrastructure.Identity; |
||||
|
using Microsoft.eShopWeb.Web.Interfaces; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Pages.Basket |
||||
|
{ |
||||
|
public class CheckoutModel : PageModel |
||||
|
{ |
||||
|
private readonly IBasketService _basketService; |
||||
|
private readonly IUriComposer _uriComposer; |
||||
|
private readonly SignInManager<ApplicationUser> _signInManager; |
||||
|
private readonly IOrderService _orderService; |
||||
|
private string _username = null; |
||||
|
private readonly IBasketViewModelService _basketViewModelService; |
||||
|
|
||||
|
public CheckoutModel(IBasketService basketService, |
||||
|
IBasketViewModelService basketViewModelService, |
||||
|
IUriComposer uriComposer, |
||||
|
SignInManager<ApplicationUser> signInManager, |
||||
|
IOrderService orderService) |
||||
|
{ |
||||
|
_basketService = basketService; |
||||
|
_uriComposer = uriComposer; |
||||
|
_signInManager = signInManager; |
||||
|
_orderService = orderService; |
||||
|
_basketViewModelService = basketViewModelService; |
||||
|
} |
||||
|
|
||||
|
public BasketViewModel BasketModel { get; set; } = new BasketViewModel(); |
||||
|
|
||||
|
public void OnGet() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public async Task<IActionResult> OnPost(Dictionary<string, int> items) |
||||
|
{ |
||||
|
await SetBasketModelAsync(); |
||||
|
|
||||
|
await _basketService.SetQuantities(BasketModel.Id, items); |
||||
|
|
||||
|
await _orderService.CreateOrderAsync(BasketModel.Id, new Address("123 Main St.", "Kent", "OH", "United States", "44240")); |
||||
|
|
||||
|
await _basketService.DeleteBasketAsync(BasketModel.Id); |
||||
|
|
||||
|
return RedirectToPage(); |
||||
|
} |
||||
|
|
||||
|
private async Task SetBasketModelAsync() |
||||
|
{ |
||||
|
if (_signInManager.IsSignedIn(HttpContext.User)) |
||||
|
{ |
||||
|
BasketModel = await _basketViewModelService.GetOrCreateBasketForUser(User.Identity.Name); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
GetOrSetBasketCookieAndUserName(); |
||||
|
BasketModel = await _basketViewModelService.GetOrCreateBasketForUser(_username); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void GetOrSetBasketCookieAndUserName() |
||||
|
{ |
||||
|
if (Request.Cookies.ContainsKey(Constants.BASKET_COOKIENAME)) |
||||
|
{ |
||||
|
_username = Request.Cookies[Constants.BASKET_COOKIENAME]; |
||||
|
} |
||||
|
if (_username != null) return; |
||||
|
|
||||
|
_username = Guid.NewGuid().ToString(); |
||||
|
var cookieOptions = new CookieOptions(); |
||||
|
cookieOptions.Expires = DateTime.Today.AddYears(10); |
||||
|
Response.Cookies.Append(Constants.BASKET_COOKIENAME, _username, cookieOptions); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,92 @@ |
|||||
|
using Microsoft.AspNetCore.Http; |
||||
|
using Microsoft.AspNetCore.Identity; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
||||
|
using Microsoft.eShopWeb.Infrastructure.Identity; |
||||
|
using Microsoft.eShopWeb.Web.Interfaces; |
||||
|
using Microsoft.eShopWeb.Web.ViewModels; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Pages.Basket |
||||
|
{ |
||||
|
public class IndexModel : PageModel |
||||
|
{ |
||||
|
private readonly IBasketService _basketService; |
||||
|
private const string _basketSessionKey = "basketId"; |
||||
|
private readonly IUriComposer _uriComposer; |
||||
|
private readonly SignInManager<ApplicationUser> _signInManager; |
||||
|
private string _username = null; |
||||
|
private readonly IBasketViewModelService _basketViewModelService; |
||||
|
|
||||
|
public IndexModel(IBasketService basketService, |
||||
|
IBasketViewModelService basketViewModelService, |
||||
|
IUriComposer uriComposer, |
||||
|
SignInManager<ApplicationUser> signInManager) |
||||
|
{ |
||||
|
_basketService = basketService; |
||||
|
_uriComposer = uriComposer; |
||||
|
_signInManager = signInManager; |
||||
|
_basketViewModelService = basketViewModelService; |
||||
|
} |
||||
|
|
||||
|
public BasketViewModel BasketModel { get; set; } = new BasketViewModel(); |
||||
|
|
||||
|
public async Task OnGet() |
||||
|
{ |
||||
|
await SetBasketModelAsync(); |
||||
|
} |
||||
|
|
||||
|
public async Task<IActionResult> OnPost(CatalogItemViewModel productDetails) |
||||
|
{ |
||||
|
if (productDetails?.Id == null) |
||||
|
{ |
||||
|
return RedirectToPage("/Index"); |
||||
|
} |
||||
|
await SetBasketModelAsync(); |
||||
|
|
||||
|
await _basketService.AddItemToBasket(BasketModel.Id, productDetails.Id, productDetails.Price, 1); |
||||
|
|
||||
|
await SetBasketModelAsync(); |
||||
|
|
||||
|
return RedirectToPage(); |
||||
|
} |
||||
|
|
||||
|
public async Task OnPostUpdate(Dictionary<string, int> items) |
||||
|
{ |
||||
|
await SetBasketModelAsync(); |
||||
|
await _basketService.SetQuantities(BasketModel.Id, items); |
||||
|
|
||||
|
await SetBasketModelAsync(); |
||||
|
} |
||||
|
|
||||
|
private async Task SetBasketModelAsync() |
||||
|
{ |
||||
|
if (_signInManager.IsSignedIn(HttpContext.User)) |
||||
|
{ |
||||
|
BasketModel = await _basketViewModelService.GetOrCreateBasketForUser(User.Identity.Name); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
GetOrSetBasketCookieAndUserName(); |
||||
|
BasketModel = await _basketViewModelService.GetOrCreateBasketForUser(_username); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void GetOrSetBasketCookieAndUserName() |
||||
|
{ |
||||
|
if (Request.Cookies.ContainsKey(Constants.BASKET_COOKIENAME)) |
||||
|
{ |
||||
|
_username = Request.Cookies[Constants.BASKET_COOKIENAME]; |
||||
|
} |
||||
|
if (_username != null) return; |
||||
|
|
||||
|
_username = Guid.NewGuid().ToString(); |
||||
|
var cookieOptions = new CookieOptions { IsEssential = true }; |
||||
|
cookieOptions.Expires = DateTime.Today.AddYears(10); |
||||
|
Response.Cookies.Append(Constants.BASKET_COOKIENAME, _username, cookieOptions); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
@page |
||||
|
@model ErrorModel |
||||
|
@{ |
||||
|
ViewData["Title"] = "Error"; |
||||
|
} |
||||
|
|
||||
|
<h1 class="text-danger">Error.</h1> |
||||
|
<h2 class="text-danger">An error occurred while processing your request.</h2> |
||||
|
|
||||
|
@if (Model.ShowRequestId) |
||||
|
{ |
||||
|
<p> |
||||
|
<strong>Request ID:</strong> <code>@Model.RequestId</code> |
||||
|
</p> |
||||
|
} |
||||
|
|
||||
|
<h3>Development Mode</h3> |
||||
|
<p> |
||||
|
Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred. |
||||
|
</p> |
||||
|
<p> |
||||
|
<strong>The Development environment shouldn't be enabled for deployed applications.</strong> |
||||
|
It can result in displaying sensitive information from exceptions to end users. |
||||
|
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong> |
||||
|
and restarting the app. |
||||
|
</p> |
||||
@ -0,0 +1,19 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
using System.Diagnostics; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Pages |
||||
|
{ |
||||
|
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] |
||||
|
public class ErrorModel : PageModel |
||||
|
{ |
||||
|
public string RequestId { get; set; } |
||||
|
|
||||
|
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); |
||||
|
|
||||
|
public void OnGet() |
||||
|
{ |
||||
|
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,43 +1,40 @@ |
|||||
@{ |
@page |
||||
|
@{ |
||||
ViewData["Title"] = "Catalog"; |
ViewData["Title"] = "Catalog"; |
||||
@model CatalogIndexViewModel |
@model IndexModel |
||||
} |
} |
||||
<section class="esh-catalog-hero"> |
<section class="esh-catalog-hero"> |
||||
<div class="container"> |
<div class="container"> |
||||
<img class="esh-catalog-title" src="../images/main_banner_text.png" /> |
<img class="esh-catalog-title" src="~/images/main_banner_text.png" /> |
||||
</div> |
</div> |
||||
</section> |
</section> |
||||
|
|
||||
<section class="esh-catalog-filters"> |
<section class="esh-catalog-filters"> |
||||
<div class="container"> |
<div class="container"> |
||||
<form asp-action="Index" asp-controller="Catalog" method="post"> |
<form method="get"> |
||||
<label class="esh-catalog-label" data-title="brand"> |
<label class="esh-catalog-label" data-title="brand"> |
||||
<select asp-for="@Model.BrandFilterApplied" asp-items="@Model.Brands" class="esh-catalog-filter"></select> |
<select asp-for="@Model.CatalogModel.BrandFilterApplied" asp-items="@Model.CatalogModel.Brands" class="esh-catalog-filter"></select> |
||||
</label> |
</label> |
||||
<label class="esh-catalog-label" data-title="type"> |
<label class="esh-catalog-label" data-title="type"> |
||||
<select asp-for="@Model.TypesFilterApplied" asp-items="@Model.Types" class="esh-catalog-filter"></select> |
<select asp-for="@Model.CatalogModel.TypesFilterApplied" asp-items="@Model.CatalogModel.Types" class="esh-catalog-filter"></select> |
||||
</label> |
</label> |
||||
<input class="esh-catalog-send" type="image" src="images/arrow-right.svg" /> |
<input class="esh-catalog-send" type="image" src="images/arrow-right.svg" /> |
||||
</form> |
</form> |
||||
</div> |
</div> |
||||
</section> |
</section> |
||||
|
|
||||
<div class="container"> |
<div class="container"> |
||||
|
@if (Model.CatalogModel.CatalogItems.Any()) |
||||
@if (Model.CatalogItems.Any()) |
|
||||
{ |
{ |
||||
<partial name="_pagination" for="PaginationInfo" /> |
<partial name="_pagination" for="CatalogModel.PaginationInfo" /> |
||||
|
|
||||
<div class="esh-catalog-items row"> |
<div class="esh-catalog-items row"> |
||||
@foreach (var catalogItem in Model.CatalogItems) |
@foreach (var catalogItem in Model.CatalogModel.CatalogItems) |
||||
{ |
{ |
||||
<div class="esh-catalog-item col-md-4"> |
<div class="esh-catalog-item col-md-4"> |
||||
<partial name="_product" model="catalogItem" /> |
<partial name="_product" for="@catalogItem" /> |
||||
</div> |
</div> |
||||
} |
} |
||||
</div> |
</div> |
||||
|
<partial name="_pagination" for="CatalogModel.PaginationInfo" /> |
||||
<partial name="_pagination" for="PaginationInfo" /> |
|
||||
} |
} |
||||
else |
else |
||||
{ |
{ |
||||
@ -0,0 +1,26 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
using Microsoft.eShopWeb.Web.Services; |
||||
|
using Microsoft.eShopWeb.Web.ViewModels; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Pages |
||||
|
{ |
||||
|
public class IndexModel : PageModel |
||||
|
{ |
||||
|
private readonly ICatalogService _catalogService; |
||||
|
|
||||
|
public IndexModel(ICatalogService catalogService) |
||||
|
{ |
||||
|
_catalogService = catalogService; |
||||
|
} |
||||
|
|
||||
|
public CatalogIndexViewModel CatalogModel { get; set; } = new CatalogIndexViewModel(); |
||||
|
|
||||
|
public async Task OnGet(CatalogIndexViewModel catalogModel, int? pageId) |
||||
|
{ |
||||
|
CatalogModel = await _catalogService.GetCatalogItems(pageId ?? 0, Constants.ITEMS_PER_PAGE, catalogModel.BrandFilterApplied, catalogModel.TypesFilterApplied); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,8 @@ |
|||||
|
@page |
||||
|
@model PrivacyModel |
||||
|
@{ |
||||
|
ViewData["Title"] = "Privacy Policy"; |
||||
|
} |
||||
|
<h1>@ViewData["Title"]</h1> |
||||
|
|
||||
|
<p>Use this page to detail your site's privacy policy.</p> |
||||
@ -0,0 +1,11 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Pages |
||||
|
{ |
||||
|
public class PrivacyModel : PageModel |
||||
|
{ |
||||
|
public void OnGet() |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,14 +1,13 @@ |
|||||
using Microsoft.eShopWeb.Infrastructure.Identity; |
using Microsoft.AspNetCore.Identity; |
||||
using Microsoft.AspNetCore.Http; |
|
||||
using Microsoft.AspNetCore.Identity; |
|
||||
using Microsoft.AspNetCore.Mvc; |
using Microsoft.AspNetCore.Mvc; |
||||
using Microsoft.eShopWeb; |
using Microsoft.eShopWeb.Infrastructure.Identity; |
||||
using Microsoft.eShopWeb.Web.Interfaces; |
using Microsoft.eShopWeb.Web.Interfaces; |
||||
|
using Microsoft.eShopWeb.Web.Pages.Basket; |
||||
using Microsoft.eShopWeb.Web.ViewModels; |
using Microsoft.eShopWeb.Web.ViewModels; |
||||
using System.Linq; |
using System.Linq; |
||||
using System.Threading.Tasks; |
using System.Threading.Tasks; |
||||
|
|
||||
namespace Microsoft.eShopWeb.Web.ViewComponents |
namespace Microsoft.eShopWeb.Web.Pages.Shared.Components.BasketComponent |
||||
{ |
{ |
||||
public class Basket : ViewComponent |
public class Basket : ViewComponent |
||||
{ |
{ |
||||
@ -0,0 +1,13 @@ |
|||||
|
@model BasketComponentViewModel |
||||
|
@{ |
||||
|
ViewData["Title"] = "My Basket"; |
||||
|
} |
||||
|
<a class="esh-basketstatus " |
||||
|
asp-page="/Basket/Index"> |
||||
|
<div class="esh-basketstatus-image"> |
||||
|
<img src="~/images/cart.png" /> |
||||
|
</div> |
||||
|
<div class="esh-basketstatus-badge"> |
||||
|
@Model.ItemsCount |
||||
|
</div> |
||||
|
</a> |
||||
@ -1,22 +1,14 @@ |
|||||
@model CatalogItemViewModel |
@model CatalogItemViewModel |
||||
|
|
||||
|
<form asp-page="/Basket/Index" method="post"> |
||||
<form asp-controller="Basket" asp-action="AddToBasket"> |
|
||||
|
|
||||
<img class="esh-catalog-thumbnail" src="@Model.PictureUri" /> |
<img class="esh-catalog-thumbnail" src="@Model.PictureUri" /> |
||||
<input class="esh-catalog-button" type="submit" value="[ ADD TO BASKET ]" /> |
<input class="esh-catalog-button" type="submit" value="[ ADD TO BASKET ]" /> |
||||
|
|
||||
<div class="esh-catalog-name"> |
<div class="esh-catalog-name"> |
||||
<span>@Model.Name</span> |
<span>@Model.Name</span> |
||||
</div> |
</div> |
||||
<div class="esh-catalog-price"> |
<div class="esh-catalog-price"> |
||||
<span>@Model.Price.ToString("N2")</span> |
<span>@Model.Price.ToString("N2")</span> |
||||
</div> |
</div> |
||||
@*<input type="hidden" asp-for="@Model.CatalogBrand" name="brand" /> |
|
||||
<input type="hidden" asp-for="@Model.CatalogBrandId" name="brandId" /> |
|
||||
<input type="hidden" asp-for="@Model.CatalogType" name="type" /> |
|
||||
<input type="hidden" asp-for="@Model.CatalogTypeId" name="typeId" /> |
|
||||
<input type="hidden" asp-for="@Model.Description" name="description" />*@ |
|
||||
<input type="hidden" asp-for="@Model.Id" name="id" /> |
<input type="hidden" asp-for="@Model.Id" name="id" /> |
||||
<input type="hidden" asp-for="@Model.Name" name="name" /> |
<input type="hidden" asp-for="@Model.Name" name="name" /> |
||||
<input type="hidden" asp-for="@Model.PictureUri" name="pictureUri" /> |
<input type="hidden" asp-for="@Model.PictureUri" name="pictureUri" /> |
||||
@ -0,0 +1,9 @@ |
|||||
|
@using Microsoft.eShopWeb.Web |
||||
|
@using Microsoft.eShopWeb.Web.ViewModels |
||||
|
@using Microsoft.eShopWeb.Web.ViewModels.Account |
||||
|
@using Microsoft.eShopWeb.Web.ViewModels.Manage |
||||
|
@using Microsoft.eShopWeb.Web.Pages |
||||
|
@using Microsoft.AspNetCore.Identity |
||||
|
@using Microsoft.eShopWeb.Infrastructure.Identity |
||||
|
@namespace Microsoft.eShopWeb.Web.Pages |
||||
|
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers |
||||
@ -0,0 +1,3 @@ |
|||||
|
@{ |
||||
|
Layout = "_Layout"; |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using Microsoft.AspNetCore.Routing; |
||||
|
using System.Text.RegularExpressions; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web |
||||
|
{ |
||||
|
|
||||
|
public class SlugifyParameterTransformer : IOutboundParameterTransformer |
||||
|
{ |
||||
|
public string TransformOutbound(object value) |
||||
|
{ |
||||
|
if (value == null) { return null; } |
||||
|
|
||||
|
// Slugify value
|
||||
|
return Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,16 +0,0 @@ |
|||||
@using Microsoft.eShopWeb.Web.ViewModels |
|
||||
@{ |
|
||||
ViewData["Title"] = "Checkout Complete"; |
|
||||
@model BasketViewModel |
|
||||
} |
|
||||
<section class="esh-catalog-hero"> |
|
||||
<div class="container"> |
|
||||
<img class="esh-catalog-title" src="../images/main_banner_text.png" /> |
|
||||
</div> |
|
||||
</section> |
|
||||
|
|
||||
<div class="container"> |
|
||||
<h1>Thanks for your Order!</h1> |
|
||||
|
|
||||
<a asp-controller="Catalog" asp-action="Index">Continue Shopping...</a> |
|
||||
</div> |
|
||||
@ -1,5 +1,4 @@ |
|||||
@using Microsoft.eShopWeb.Web.ViewModels |
@model IEnumerable<OrderViewModel> |
||||
@model IEnumerable<OrderViewModel> |
|
||||
@{ |
@{ |
||||
ViewData["Title"] = "My Order History"; |
ViewData["Title"] = "My Order History"; |
||||
} |
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
@using Microsoft.AspNetCore.Http.Features |
||||
|
|
||||
|
@{ |
||||
|
var consentFeature = Context.Features.Get<ITrackingConsentFeature>(); |
||||
|
var showBanner = !consentFeature?.CanTrack ?? false; |
||||
|
var cookieString = consentFeature?.CreateConsentCookie(); |
||||
|
} |
||||
|
|
||||
|
@if (showBanner) |
||||
|
{ |
||||
|
<div id="cookieConsent" class="alert alert-info alert-dismissible fade show" role="alert"> |
||||
|
Use this space to summarize your privacy and cookie use policy. <a asp-area="" asp-controller="Home" asp-action="Privacy">Learn More</a>. |
||||
|
<button type="button" class="accept-policy close" data-dismiss="alert" aria-label="Close" data-cookie-string="@cookieString"> |
||||
|
<span aria-hidden="true">Accept</span> |
||||
|
</button> |
||||
|
</div> |
||||
|
<script> |
||||
|
(function () { |
||||
|
var button = document.querySelector("#cookieConsent button[data-cookie-string]"); |
||||
|
button.addEventListener("click", function (event) { |
||||
|
document.cookie = button.dataset.cookieString; |
||||
|
}, false); |
||||
|
})(); |
||||
|
</script> |
||||
|
} |
||||
@ -1,77 +1,66 @@ |
|||||
<!DOCTYPE html> |
<!DOCTYPE html> |
||||
<html> |
<html> |
||||
<head> |
<head> |
||||
<meta charset="utf-8" /> |
<meta charset="utf-8" /> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||
<title>@ViewData["Title"] - Microsoft.eShopOnWeb</title> |
<title>@ViewData["Title"] - Microsoft.eShopOnWeb</title> |
||||
|
<environment names="Development"> |
||||
<environment names="Development"> |
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" /> |
||||
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" /> |
<link rel="stylesheet" href="~/css/app.css" /> |
||||
<link rel="stylesheet" href="~/css/app.css" /> |
</environment> |
||||
</environment> |
<environment names="Staging,Production"> |
||||
<environment names="Staging,Production"> |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" |
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" |
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css" |
||||
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css" |
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" /> |
||||
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" /> |
<link rel="stylesheet" href="~/css/app.min.css" asp-append-version="true" /> |
||||
<link rel="stylesheet" href="~/css/app.min.css" asp-append-version="true" /> |
</environment> |
||||
</environment> |
|
||||
<link rel="stylesheet" href="~/css/app.component.css" /> |
<link rel="stylesheet" href="~/css/app.component.css" /> |
||||
<link rel="stylesheet" href="~/css/basket/basket.component.css" /> |
<link rel="stylesheet" href="~/css/basket/basket.component.css" /> |
||||
<link rel="stylesheet" href="~/css/catalog/pager.css" /> |
<link rel="stylesheet" href="~/css/catalog/pager.css" /> |
||||
<link rel="stylesheet" href="~/css/catalog/catalog.component.css" /> |
<link rel="stylesheet" href="~/css/catalog/catalog.component.css" /> |
||||
<link rel="stylesheet" href="~/css/basket/basket-status/basket-status.component.css" /> |
<link rel="stylesheet" href="~/css/basket/basket-status/basket-status.component.css" /> |
||||
<link rel="stylesheet" href="~/css/orders/orders.component.css" /> |
<link rel="stylesheet" href="~/css/orders/orders.component.css" /> |
||||
</head> |
</head> |
||||
<body> |
<body> |
||||
<header class="navbar navbar-light navbar-static-top"> |
<header class="navbar navbar-light navbar-static-top"> |
||||
<div class="container"> |
<div class="container"> |
||||
<article class="row"> |
<article class="row"> |
||||
|
<section class="col-lg-7 col-md-6 col-xs-12"> |
||||
<section class="col-lg-7 col-md-6 col-xs-12"> |
<a asp-area="" asp-page="/Index" class="navbar-brand"> |
||||
<a asp-area="" asp-controller="Catalog" asp-action="Index" class="navbar-brand"> |
<img src="~/images/brand.png" alt="eShop On Web" /> |
||||
<img src="../images/brand.png" alt="eShop On Web"/> |
</a> |
||||
</a> |
</section> |
||||
</section> |
|
||||
<partial name="_LoginPartial" /> |
<partial name="_LoginPartial" /> |
||||
</article> |
</article> |
||||
</div> |
</div> |
||||
</header> |
</header> |
||||
|
@RenderBody() |
||||
@RenderBody() |
<footer class="esh-app-footer"> |
||||
|
<div class="container"> |
||||
|
<article class="row"> |
||||
<footer class="esh-app-footer"> |
<section class="col-sm-6"></section> |
||||
<div class="container"> |
<section class="col-sm-6"> |
||||
<article class="row"> |
<div class="esh-app-footer-text hidden-xs"> e-ShopOnWeb. All rights reserved </div> |
||||
|
</section> |
||||
<section class="col-sm-6"> |
</article> |
||||
</section> |
</div> |
||||
|
</footer> |
||||
<section class="col-sm-6"> |
<environment names="Development"> |
||||
<div class="esh-app-footer-text hidden-xs"> e-ShopOnWeb. All rights reserved </div> |
<script src="~/lib/jquery/dist/jquery.js"></script> |
||||
</section> |
<script src="~/lib/bootstrap/dist/js/bootstrap.js"></script> |
||||
|
<script src="~/js/site.js" asp-append-version="true"></script> |
||||
</article> |
</environment> |
||||
</div> |
<environment names="Staging,Production"> |
||||
</footer> |
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js" |
||||
|
asp-fallback-src="~/lib/jquery/dist/jquery.min.js" |
||||
<environment names="Development"> |
asp-fallback-test="window.jQuery"> |
||||
<script src="~/lib/jquery/dist/jquery.js"></script> |
</script> |
||||
<script src="~/lib/bootstrap/dist/js/bootstrap.js"></script> |
<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/bootstrap.min.js" |
||||
<script src="~/js/site.js" asp-append-version="true"></script> |
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js" |
||||
</environment> |
asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"> |
||||
<environment names="Staging,Production"> |
</script> |
||||
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js" |
<script src="~/js/site.min.js" asp-append-version="true"></script> |
||||
asp-fallback-src="~/lib/jquery/dist/jquery.min.js" |
</environment> |
||||
asp-fallback-test="window.jQuery"> |
@RenderSection("scripts", required: false) |
||||
</script> |
|
||||
<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/bootstrap.min.js" |
|
||||
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js" |
|
||||
asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"> |
|
||||
</script> |
|
||||
<script src="~/js/site.min.js" asp-append-version="true"></script> |
|
||||
</environment> |
|
||||
|
|
||||
@RenderSection("scripts", required: false) |
|
||||
</body> |
</body> |
||||
</html> |
</html> |
||||
|
|||||
@ -1,66 +1,55 @@ |
|||||
@using Microsoft.AspNetCore.Identity |
@if (Context.User.Identity.IsAuthenticated) |
||||
|
|
||||
@if (Context.User.Identity.IsAuthenticated) |
|
||||
{ |
{ |
||||
<section class="col-lg-4 col-md-5 col-xs-12"> |
<section class="col-lg-4 col-md-5 col-xs-12"> |
||||
<div class="esh-identity"> |
<div class="esh-identity"> |
||||
<form asp-area="" asp-controller="Account" asp-action="SignOut" method="post" id="logoutForm" class="navbar-right"> |
<form asp-area="" asp-controller="Account" asp-action="SignOut" method="post" id="logoutForm" class="navbar-right"> |
||||
<section class="esh-identity-section"> |
<section class="esh-identity-section"> |
||||
|
@*<div class="esh-identity-name">@User.FindFirst(x => x.Type == "preferred_username").Value</div>*@ |
||||
@*<div class="esh-identity-name">@User.FindFirst(x => x.Type == "preferred_username").Value</div>*@ |
<img class="esh-identity-image" src="~/images/arrow-down.png"> |
||||
<img class="esh-identity-image" src="~/images/arrow-down.png"> |
</section> |
||||
</section> |
<section class="esh-identity-drop"> |
||||
|
<a class="esh-identity-item" |
||||
<section class="esh-identity-drop"> |
asp-controller="Order" |
||||
|
asp-action="MyOrders"> |
||||
<a class="esh-identity-item" |
<div class="esh-identity-name esh-identity-name--upper">My orders</div> |
||||
asp-controller="Order" |
<img class="esh-identity-image" src="~/images/my_orders.png"> |
||||
asp-action="Index"> |
</a> |
||||
|
<a class="esh-identity-item" |
||||
<div class="esh-identity-name esh-identity-name--upper">My orders</div> |
asp-controller="Manage" |
||||
<img class="esh-identity-image" src="~/images/my_orders.png"> |
asp-action="MyAccount"> |
||||
</a> |
<div class="esh-identity-name esh-identity-name--upper">My account</div> |
||||
|
<img class="esh-identity-image" src="~/images/my_orders.png"> |
||||
<a class="esh-identity-item" |
</a> |
||||
asp-controller="Manage" |
<a class="esh-identity-item" |
||||
asp-action="Index"> |
href="javascript:document.getElementById('logoutForm').submit()"> |
||||
|
<div class="esh-identity-name esh-identity-name--upper">Log Out</div> |
||||
<div class="esh-identity-name esh-identity-name--upper">My account</div> |
<img class="esh-identity-image" src="~/images/logout.png"> |
||||
<img class="esh-identity-image" src="~/images/my_orders.png"> |
</a> |
||||
</a> |
</section> |
||||
|
</form> |
||||
<a class="esh-identity-item" |
</div> |
||||
href="javascript:document.getElementById('logoutForm').submit()"> |
</section> |
||||
|
|
||||
<div class="esh-identity-name esh-identity-name--upper">Log Out</div> |
|
||||
<img class="esh-identity-image" src="~/images/logout.png"> |
|
||||
</a> |
|
||||
</section> |
|
||||
</form> |
|
||||
</div> |
|
||||
</section> |
|
||||
|
|
||||
<section class="col-lg-1 col-xs-12"> |
<section class="col-lg-1 col-xs-12"> |
||||
@await Component.InvokeAsync("Basket", User.Identity.Name) |
@await Component.InvokeAsync("Basket", User.Identity.Name) |
||||
</section> |
</section> |
||||
|
|
||||
} |
} |
||||
else |
else |
||||
{ |
{ |
||||
<section class="col-lg-1 col-lg-offset-3 col-md-3 col-xs-6"> |
<section class="col-lg-1 col-lg-offset-3 col-md-3 col-xs-6"> |
||||
<div class="esh-identity"> |
<div class="esh-identity"> |
||||
<section class="esh-identity-section"> |
<section class="esh-identity-section"> |
||||
<div class="esh-identity-item"> |
<div class="esh-identity-item"> |
||||
|
<a asp-area="" asp-controller="Account" asp-action="SignIn" class="esh-identity-name esh-identity-name--upper"> |
||||
<a asp-area="" asp-controller="Account" asp-action="SignIn" class="esh-identity-name esh-identity-name--upper"> |
Login |
||||
Login |
</a> |
||||
</a> |
</div> |
||||
</div> |
</section> |
||||
</section> |
</div> |
||||
</div> |
</section> |
||||
</section> |
|
||||
|
<section class="col-lg-1 col-xs-12"> |
||||
<section class="col-lg-1 col-xs-12"> |
@await Component.InvokeAsync("Basket") |
||||
@await Component.InvokeAsync("Basket") |
</section> |
||||
</section> |
|
||||
} |
} |
||||
|
|||||
@ -1,10 +0,0 @@ |
|||||
{ |
|
||||
"name": "asp.net", |
|
||||
"private": true, |
|
||||
"dependencies": { |
|
||||
"bootstrap": "3.3.7", |
|
||||
"jquery": "2.2.0", |
|
||||
"jquery-validation": "1.14.0", |
|
||||
"jquery-validation-unobtrusive": "3.2.6" |
|
||||
} |
|
||||
} |
|
||||
@ -1,24 +0,0 @@ |
|||||
// Configure bundling and minification for the project. |
|
||||
// More info at https://go.microsoft.com/fwlink/?LinkId=808241 |
|
||||
[ |
|
||||
{ |
|
||||
"outputFileName": "wwwroot/css/app.min.css", |
|
||||
// An array of relative input file paths. Globbing patterns supported |
|
||||
"inputFiles": [ |
|
||||
"wwwroot/css/app.css" |
|
||||
] |
|
||||
}, |
|
||||
{ |
|
||||
"outputFileName": "wwwroot/js/site.min.js", |
|
||||
"inputFiles": [ |
|
||||
"wwwroot/js/site.js" |
|
||||
], |
|
||||
// Optionally specify minification options |
|
||||
"minify": { |
|
||||
"enabled": true, |
|
||||
"renameLocals": true |
|
||||
}, |
|
||||
// Optionally generate .map file |
|
||||
"sourceMap": false |
|
||||
} |
|
||||
] |
|
||||
@ -1,42 +0,0 @@ |
|||||
[ |
|
||||
{ |
|
||||
"outputFile": "wwwroot/css/orders/orders.component.css", |
|
||||
"inputFile": "wwwroot/css/orders/orders.component.scss" |
|
||||
}, |
|
||||
//{ |
|
||||
// "outputFile": "wwwroot/css/orders/orders-new/orders-new.component.css", |
|
||||
// "inputFile": "wwwroot/css/orders/orders-new/orders-new.component.scss" |
|
||||
//}, |
|
||||
//{ |
|
||||
// "outputFile": "wwwroot/css/orders/orders-detail/orders-detail.component.css", |
|
||||
// "inputFile": "wwwroot/css/orders/orders-detail/orders-detail.component.scss" |
|
||||
//}, |
|
||||
{ |
|
||||
"outputFile": "wwwroot/css/catalog/catalog.component.css", |
|
||||
"inputFile": "wwwroot/css/catalog/catalog.component.scss" |
|
||||
}, |
|
||||
{ |
|
||||
"outputFile": "wwwroot/css/basket/basket.component.css", |
|
||||
"inputFile": "wwwroot/css/basket/basket.component.scss" |
|
||||
}, |
|
||||
{ |
|
||||
"outputFile": "wwwroot/css/basket/basket-status/basket-status.component.css", |
|
||||
"inputFile": "wwwroot/css/basket/basket-status/basket-status.component.scss" |
|
||||
}, |
|
||||
//{ |
|
||||
// "outputFile": "wwwroot/css/shared/components/header/header.css", |
|
||||
// "inputFile": "wwwroot/css/shared/components/header/header.scss" |
|
||||
//}, |
|
||||
//{ |
|
||||
// "outputFile": "wwwroot/css/shared/components/identity/identity.css", |
|
||||
// "inputFile": "wwwroot/css/shared/components/identity/identity.scss" |
|
||||
//}, |
|
||||
//{ |
|
||||
// "outputFile": "wwwroot/css/shared/components/pager/pager.css", |
|
||||
// "inputFile": "wwwroot/css/shared/components/pager/pager.scss" |
|
||||
//}, |
|
||||
{ |
|
||||
"outputFile": "wwwroot/css/app.component.css", |
|
||||
"inputFile": "wwwroot/css/app.component.scss" |
|
||||
} |
|
||||
] |
|
||||
@ -1,40 +0,0 @@ |
|||||
{ |
|
||||
"name": "jquery-validation", |
|
||||
"homepage": "http://jqueryvalidation.org/", |
|
||||
"repository": { |
|
||||
"type": "git", |
|
||||
"url": "git://github.com/jzaefferer/jquery-validation.git" |
|
||||
}, |
|
||||
"authors": [ |
|
||||
"Jörn Zaefferer <joern.zaefferer@gmail.com>" |
|
||||
], |
|
||||
"description": "Form validation made easy", |
|
||||
"main": "dist/jquery.validate.js", |
|
||||
"keywords": [ |
|
||||
"forms", |
|
||||
"validation", |
|
||||
"validate" |
|
||||
], |
|
||||
"license": "MIT", |
|
||||
"ignore": [ |
|
||||
"**/.*", |
|
||||
"node_modules", |
|
||||
"bower_components", |
|
||||
"test", |
|
||||
"demo", |
|
||||
"lib" |
|
||||
], |
|
||||
"dependencies": { |
|
||||
"jquery": ">= 1.7.2" |
|
||||
}, |
|
||||
"version": "1.14.0", |
|
||||
"_release": "1.14.0", |
|
||||
"_resolution": { |
|
||||
"type": "version", |
|
||||
"tag": "1.14.0", |
|
||||
"commit": "c1343fb9823392aa9acbe1c3ffd337b8c92fed48" |
|
||||
}, |
|
||||
"_source": "git://github.com/jzaefferer/jquery-validation.git", |
|
||||
"_target": ">=1.8", |
|
||||
"_originalSource": "jquery-validation" |
|
||||
} |
|
||||
@ -1,3 +0,0 @@ |
|||||
{ |
|
||||
"directory": "wwwroot/lib" |
|
||||
} |
|
||||
@ -0,0 +1,3 @@ |
|||||
|
@{ |
||||
|
Layout = "/Pages/Shared/_Layout.cshtml"; |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Text; |
||||
|
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
|
||||
|
namespace WebRazorPages.Data |
||||
|
{ |
||||
|
public class ApplicationDbContext : IdentityDbContext |
||||
|
{ |
||||
|
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) |
||||
|
: base(options) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,236 @@ |
|||||
|
// <auto-generated />
|
||||
|
using System; |
||||
|
using WebRazorPages.Data; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Infrastructure; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
||||
|
|
||||
|
namespace WebRazorPages.Data.Migrations |
||||
|
{ |
||||
|
[DbContext(typeof(ApplicationDbContext))] |
||||
|
[Migration("00000000000000_CreateIdentitySchema")] |
||||
|
partial class CreateIdentitySchema |
||||
|
{ |
||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
#pragma warning disable 612, 618
|
||||
|
modelBuilder |
||||
|
.HasAnnotation("ProductVersion", "2.2.0-preview1") |
||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => |
||||
|
{ |
||||
|
b.Property<string>("Id") |
||||
|
.ValueGeneratedOnAdd(); |
||||
|
|
||||
|
b.Property<string>("ConcurrencyStamp") |
||||
|
.IsConcurrencyToken(); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("NormalizedName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("NormalizedName") |
||||
|
.IsUnique() |
||||
|
.HasName("RoleNameIndex") |
||||
|
.HasFilter("[NormalizedName] IS NOT NULL"); |
||||
|
|
||||
|
b.ToTable("AspNetRoles"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => |
||||
|
{ |
||||
|
b.Property<int>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
b.Property<string>("ClaimType"); |
||||
|
|
||||
|
b.Property<string>("ClaimValue"); |
||||
|
|
||||
|
b.Property<string>("RoleId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("RoleId"); |
||||
|
|
||||
|
b.ToTable("AspNetRoleClaims"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => |
||||
|
{ |
||||
|
b.Property<string>("Id") |
||||
|
.ValueGeneratedOnAdd(); |
||||
|
|
||||
|
b.Property<int>("AccessFailedCount"); |
||||
|
|
||||
|
b.Property<string>("ConcurrencyStamp") |
||||
|
.IsConcurrencyToken(); |
||||
|
|
||||
|
b.Property<string>("Email") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<bool>("EmailConfirmed"); |
||||
|
|
||||
|
b.Property<bool>("LockoutEnabled"); |
||||
|
|
||||
|
b.Property<DateTimeOffset?>("LockoutEnd"); |
||||
|
|
||||
|
b.Property<string>("NormalizedEmail") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("NormalizedUserName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("PasswordHash"); |
||||
|
|
||||
|
b.Property<string>("PhoneNumber"); |
||||
|
|
||||
|
b.Property<bool>("PhoneNumberConfirmed"); |
||||
|
|
||||
|
b.Property<string>("SecurityStamp"); |
||||
|
|
||||
|
b.Property<bool>("TwoFactorEnabled"); |
||||
|
|
||||
|
b.Property<string>("UserName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("NormalizedEmail") |
||||
|
.HasName("EmailIndex"); |
||||
|
|
||||
|
b.HasIndex("NormalizedUserName") |
||||
|
.IsUnique() |
||||
|
.HasName("UserNameIndex") |
||||
|
.HasFilter("[NormalizedUserName] IS NOT NULL"); |
||||
|
|
||||
|
b.ToTable("AspNetUsers"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => |
||||
|
{ |
||||
|
b.Property<int>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
b.Property<string>("ClaimType"); |
||||
|
|
||||
|
b.Property<string>("ClaimValue"); |
||||
|
|
||||
|
b.Property<string>("UserId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("UserId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserClaims"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("LoginProvider") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("ProviderKey") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("ProviderDisplayName"); |
||||
|
|
||||
|
b.Property<string>("UserId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("LoginProvider", "ProviderKey"); |
||||
|
|
||||
|
b.HasIndex("UserId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserLogins"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("UserId"); |
||||
|
|
||||
|
b.Property<string>("RoleId"); |
||||
|
|
||||
|
b.HasKey("UserId", "RoleId"); |
||||
|
|
||||
|
b.HasIndex("RoleId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserRoles"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("UserId"); |
||||
|
|
||||
|
b.Property<string>("LoginProvider") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("Value"); |
||||
|
|
||||
|
b.HasKey("UserId", "LoginProvider", "Name"); |
||||
|
|
||||
|
b.ToTable("AspNetUserTokens"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("RoleId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("RoleId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
|
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
#pragma warning restore 612, 618
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,220 @@ |
|||||
|
using System; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
|
||||
|
namespace WebRazorPages.Data.Migrations |
||||
|
{ |
||||
|
public partial class CreateIdentitySchema : Migration |
||||
|
{ |
||||
|
protected override void Up(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "AspNetRoles", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<string>(nullable: false), |
||||
|
Name = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
NormalizedName = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
ConcurrencyStamp = table.Column<string>(nullable: true) |
||||
|
}, |
||||
|
constraints: table => |
||||
|
{ |
||||
|
table.PrimaryKey("PK_AspNetRoles", x => x.Id); |
||||
|
}); |
||||
|
|
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "AspNetUsers", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<string>(nullable: false), |
||||
|
UserName = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
NormalizedUserName = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
Email = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
NormalizedEmail = table.Column<string>(maxLength: 256, nullable: true), |
||||
|
EmailConfirmed = table.Column<bool>(nullable: false), |
||||
|
PasswordHash = table.Column<string>(nullable: true), |
||||
|
SecurityStamp = table.Column<string>(nullable: true), |
||||
|
ConcurrencyStamp = table.Column<string>(nullable: true), |
||||
|
PhoneNumber = table.Column<string>(nullable: true), |
||||
|
PhoneNumberConfirmed = table.Column<bool>(nullable: false), |
||||
|
TwoFactorEnabled = table.Column<bool>(nullable: false), |
||||
|
LockoutEnd = table.Column<DateTimeOffset>(nullable: true), |
||||
|
LockoutEnabled = table.Column<bool>(nullable: false), |
||||
|
AccessFailedCount = table.Column<int>(nullable: false) |
||||
|
}, |
||||
|
constraints: table => |
||||
|
{ |
||||
|
table.PrimaryKey("PK_AspNetUsers", x => x.Id); |
||||
|
}); |
||||
|
|
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "AspNetRoleClaims", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<int>(nullable: false) |
||||
|
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), |
||||
|
RoleId = table.Column<string>(nullable: false), |
||||
|
ClaimType = table.Column<string>(nullable: true), |
||||
|
ClaimValue = table.Column<string>(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<int>(nullable: false) |
||||
|
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), |
||||
|
UserId = table.Column<string>(nullable: false), |
||||
|
ClaimType = table.Column<string>(nullable: true), |
||||
|
ClaimValue = table.Column<string>(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<string>(maxLength: 128, nullable: false), |
||||
|
ProviderKey = table.Column<string>(maxLength: 128, nullable: false), |
||||
|
ProviderDisplayName = table.Column<string>(nullable: true), |
||||
|
UserId = table.Column<string>(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<string>(nullable: false), |
||||
|
RoleId = table.Column<string>(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<string>(nullable: false), |
||||
|
LoginProvider = table.Column<string>(maxLength: 128, nullable: false), |
||||
|
Name = table.Column<string>(maxLength: 128, nullable: false), |
||||
|
Value = table.Column<string>(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.CreateIndex( |
||||
|
name: "IX_AspNetRoleClaims_RoleId", |
||||
|
table: "AspNetRoleClaims", |
||||
|
column: "RoleId"); |
||||
|
|
||||
|
migrationBuilder.CreateIndex( |
||||
|
name: "RoleNameIndex", |
||||
|
table: "AspNetRoles", |
||||
|
column: "NormalizedName", |
||||
|
unique: true, |
||||
|
filter: "[NormalizedName] IS NOT NULL"); |
||||
|
|
||||
|
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, |
||||
|
filter: "[NormalizedUserName] IS NOT NULL"); |
||||
|
} |
||||
|
|
||||
|
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: "AspNetRoles"); |
||||
|
|
||||
|
migrationBuilder.DropTable( |
||||
|
name: "AspNetUsers"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,234 @@ |
|||||
|
// <auto-generated />
|
||||
|
using System; |
||||
|
using WebRazorPages.Data; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Infrastructure; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
||||
|
|
||||
|
namespace WebRazorPages.Data.Migrations |
||||
|
{ |
||||
|
[DbContext(typeof(ApplicationDbContext))] |
||||
|
partial class ApplicationDbContextModelSnapshot : ModelSnapshot |
||||
|
{ |
||||
|
protected override void BuildModel(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
#pragma warning disable 612, 618
|
||||
|
modelBuilder |
||||
|
.HasAnnotation("ProductVersion", "2.2.0-preview1") |
||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => |
||||
|
{ |
||||
|
b.Property<string>("Id") |
||||
|
.ValueGeneratedOnAdd(); |
||||
|
|
||||
|
b.Property<string>("ConcurrencyStamp") |
||||
|
.IsConcurrencyToken(); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("NormalizedName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("NormalizedName") |
||||
|
.IsUnique() |
||||
|
.HasName("RoleNameIndex") |
||||
|
.HasFilter("[NormalizedName] IS NOT NULL"); |
||||
|
|
||||
|
b.ToTable("AspNetRoles"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => |
||||
|
{ |
||||
|
b.Property<int>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
b.Property<string>("ClaimType"); |
||||
|
|
||||
|
b.Property<string>("ClaimValue"); |
||||
|
|
||||
|
b.Property<string>("RoleId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("RoleId"); |
||||
|
|
||||
|
b.ToTable("AspNetRoleClaims"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => |
||||
|
{ |
||||
|
b.Property<string>("Id") |
||||
|
.ValueGeneratedOnAdd(); |
||||
|
|
||||
|
b.Property<int>("AccessFailedCount"); |
||||
|
|
||||
|
b.Property<string>("ConcurrencyStamp") |
||||
|
.IsConcurrencyToken(); |
||||
|
|
||||
|
b.Property<string>("Email") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<bool>("EmailConfirmed"); |
||||
|
|
||||
|
b.Property<bool>("LockoutEnabled"); |
||||
|
|
||||
|
b.Property<DateTimeOffset?>("LockoutEnd"); |
||||
|
|
||||
|
b.Property<string>("NormalizedEmail") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("NormalizedUserName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.Property<string>("PasswordHash"); |
||||
|
|
||||
|
b.Property<string>("PhoneNumber"); |
||||
|
|
||||
|
b.Property<bool>("PhoneNumberConfirmed"); |
||||
|
|
||||
|
b.Property<string>("SecurityStamp"); |
||||
|
|
||||
|
b.Property<bool>("TwoFactorEnabled"); |
||||
|
|
||||
|
b.Property<string>("UserName") |
||||
|
.HasMaxLength(256); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("NormalizedEmail") |
||||
|
.HasName("EmailIndex"); |
||||
|
|
||||
|
b.HasIndex("NormalizedUserName") |
||||
|
.IsUnique() |
||||
|
.HasName("UserNameIndex") |
||||
|
.HasFilter("[NormalizedUserName] IS NOT NULL"); |
||||
|
|
||||
|
b.ToTable("AspNetUsers"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => |
||||
|
{ |
||||
|
b.Property<int>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); |
||||
|
|
||||
|
b.Property<string>("ClaimType"); |
||||
|
|
||||
|
b.Property<string>("ClaimValue"); |
||||
|
|
||||
|
b.Property<string>("UserId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.HasIndex("UserId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserClaims"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("LoginProvider") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("ProviderKey") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("ProviderDisplayName"); |
||||
|
|
||||
|
b.Property<string>("UserId") |
||||
|
.IsRequired(); |
||||
|
|
||||
|
b.HasKey("LoginProvider", "ProviderKey"); |
||||
|
|
||||
|
b.HasIndex("UserId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserLogins"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("UserId"); |
||||
|
|
||||
|
b.Property<string>("RoleId"); |
||||
|
|
||||
|
b.HasKey("UserId", "RoleId"); |
||||
|
|
||||
|
b.HasIndex("RoleId"); |
||||
|
|
||||
|
b.ToTable("AspNetUserRoles"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => |
||||
|
{ |
||||
|
b.Property<string>("UserId"); |
||||
|
|
||||
|
b.Property<string>("LoginProvider") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(128); |
||||
|
|
||||
|
b.Property<string>("Value"); |
||||
|
|
||||
|
b.HasKey("UserId", "LoginProvider", "Name"); |
||||
|
|
||||
|
b.ToTable("AspNetUserTokens"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("RoleId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("RoleId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
|
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => |
||||
|
{ |
||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") |
||||
|
.WithMany() |
||||
|
.HasForeignKey("UserId") |
||||
|
.OnDelete(DeleteBehavior.Cascade); |
||||
|
}); |
||||
|
#pragma warning restore 612, 618
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue