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.
@ -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,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 System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
|
|||
namespace Microsoft.eShopWeb.Web.Controllers.Api |
|||
{ |
|||
[Route("api/[controller]/[action]")]
|
|||
[ApiController] |
|||
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; |
|||
|
|||
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 |
|||
{ |
|||
@ -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"; |
|||
@model CatalogIndexViewModel |
|||
@model IndexModel |
|||
} |
|||
<section class="esh-catalog-hero"> |
|||
<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> |
|||
</section> |
|||
|
|||
<section class="esh-catalog-filters"> |
|||
<div class="container"> |
|||
<form asp-action="Index" asp-controller="Catalog" method="post"> |
|||
<form method="get"> |
|||
<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 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> |
|||
<input class="esh-catalog-send" type="image" src="images/arrow-right.svg" /> |
|||
</form> |
|||
</div> |
|||
</section> |
|||
|
|||
<div class="container"> |
|||
|
|||
@if (Model.CatalogItems.Any()) |
|||
@if (Model.CatalogModel.CatalogItems.Any()) |
|||
{ |
|||
<partial name="_pagination" for="PaginationInfo" /> |
|||
<partial name="_pagination" for="CatalogModel.PaginationInfo" /> |
|||
|
|||
<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"> |
|||
<partial name="_product" model="catalogItem" /> |
|||
<partial name="_product" for="@catalogItem" /> |
|||
</div> |
|||
} |
|||
</div> |
|||
|
|||
<partial name="_pagination" for="PaginationInfo" /> |
|||
<partial name="_pagination" for="CatalogModel.PaginationInfo" /> |
|||
} |
|||
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.Http; |
|||
using Microsoft.AspNetCore.Identity; |
|||
using Microsoft.AspNetCore.Identity; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Microsoft.eShopWeb; |
|||
using Microsoft.eShopWeb.Infrastructure.Identity; |
|||
using Microsoft.eShopWeb.Web.Interfaces; |
|||
using Microsoft.eShopWeb.Web.Pages.Basket; |
|||
using Microsoft.eShopWeb.Web.ViewModels; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Microsoft.eShopWeb.Web.ViewComponents |
|||
namespace Microsoft.eShopWeb.Web.Pages.Shared.Components.BasketComponent |
|||
{ |
|||
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 |
|||
|
|||
|
|||
<form asp-controller="Basket" asp-action="AddToBasket"> |
|||
|
|||
<form asp-page="/Basket/Index" method="post"> |
|||
<img class="esh-catalog-thumbnail" src="@Model.PictureUri" /> |
|||
<input class="esh-catalog-button" type="submit" value="[ ADD TO BASKET ]" /> |
|||
|
|||
<div class="esh-catalog-name"> |
|||
<span>@Model.Name</span> |
|||
</div> |
|||
<div class="esh-catalog-price"> |
|||
<span>@Model.Price.ToString("N2")</span> |
|||
</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.Name" name="name" /> |
|||
<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"; |
|||
} |
|||
@ -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,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