eShopOnContainers forkpull/1934/head
@ -1,11 +1,12 @@ | |||
using Microsoft.Extensions.Logging; | |||
using Microsoft.eShopOnContainers.Services.Basket.API.Model; | |||
using Microsoft.Extensions.Logging; | |||
using Newtonsoft.Json; | |||
using StackExchange.Redis; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace Microsoft.eShopOnContainers.Services.Basket.API.Model | |||
namespace Microsoft.eShopOnContainers.Services.Basket.API.Infrastructure.Repositories | |||
{ | |||
public class RedisBasketRepository : IBasketRepository | |||
{ |
@ -1,17 +1,16 @@ | |||
using FluentValidation; | |||
using Microsoft.Extensions.Logging; | |||
using Ordering.API.Application.Commands; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace Ordering.API.Application.Validations | |||
{ | |||
public class CancelOrderCommandValidator : AbstractValidator<CancelOrderCommand> | |||
{ | |||
public CancelOrderCommandValidator() | |||
public CancelOrderCommandValidator(ILogger<CancelOrderCommandValidator> logger) | |||
{ | |||
RuleFor(order => order.OrderNumber).NotEmpty().WithMessage("No orderId found"); | |||
logger.LogTrace("----- INSTANCE CREATED - {ClassName}", GetType().Name); | |||
} | |||
} | |||
} | |||
} |
@ -1,13 +1,16 @@ | |||
using FluentValidation; | |||
using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands; | |||
using Microsoft.Extensions.Logging; | |||
namespace Ordering.API.Application.Validations | |||
{ | |||
public class IdentifiedCommandValidator : AbstractValidator<IdentifiedCommand<CreateOrderCommand,bool>> | |||
{ | |||
public IdentifiedCommandValidator() | |||
public IdentifiedCommandValidator(ILogger<IdentifiedCommandValidator> logger) | |||
{ | |||
RuleFor(command => command.Id).NotEmpty(); | |||
RuleFor(command => command.Id).NotEmpty(); | |||
logger.LogTrace("----- INSTANCE CREATED - {ClassName}", GetType().Name); | |||
} | |||
} | |||
} |
@ -1,17 +1,16 @@ | |||
using FluentValidation; | |||
using Microsoft.Extensions.Logging; | |||
using Ordering.API.Application.Commands; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace Ordering.API.Application.Validations | |||
{ | |||
public class ShipOrderCommandValidator : AbstractValidator<ShipOrderCommand> | |||
{ | |||
public ShipOrderCommandValidator() | |||
public ShipOrderCommandValidator(ILogger<ShipOrderCommandValidator> logger) | |||
{ | |||
RuleFor(order => order.OrderNumber).NotEmpty().WithMessage("No orderId found"); | |||
logger.LogTrace("----- INSTANCE CREATED - {ClassName}", GetType().Name); | |||
} | |||
} | |||
} | |||
} |
@ -1,302 +0,0 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
<Import Project="..\packages\Microsoft.Net.Compilers.2.0.1\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.0.1\build\Microsoft.Net.Compilers.props')" /> | |||
<Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" /> | |||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | |||
<PropertyGroup> | |||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |||
<ProductVersion> | |||
</ProductVersion> | |||
<SchemaVersion>2.0</SchemaVersion> | |||
<ProjectGuid>{07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB}</ProjectGuid> | |||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids> | |||
<OutputType>Library</OutputType> | |||
<AppDesignerFolder>Properties</AppDesignerFolder> | |||
<RootNamespace>Microsoft.eShopOnContainers.Catalog.WebForms</RootNamespace> | |||
<AssemblyName>Catalog.WebForms</AssemblyName> | |||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> | |||
<UseIISExpress>true</UseIISExpress> | |||
<IISExpressSSLPort /> | |||
<IISExpressAnonymousAuthentication /> | |||
<IISExpressWindowsAuthentication /> | |||
<IISExpressUseClassicPipelineMode /> | |||
<UseGlobalApplicationHostFile /> | |||
<NuGetPackageImportStamp> | |||
</NuGetPackageImportStamp> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |||
<DebugSymbols>true</DebugSymbols> | |||
<DebugType>full</DebugType> | |||
<Optimize>false</Optimize> | |||
<OutputPath>bin\</OutputPath> | |||
<DefineConstants>DEBUG;TRACE</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |||
<DebugSymbols>true</DebugSymbols> | |||
<DebugType>pdbonly</DebugType> | |||
<Optimize>true</Optimize> | |||
<OutputPath>bin\</OutputPath> | |||
<DefineConstants>TRACE</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<Reference Include="Autofac, Version=4.3.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL"> | |||
<HintPath>..\packages\Autofac.4.3.0\lib\net45\Autofac.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> | |||
<HintPath>..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.CSharp" /> | |||
<Reference Include="System.ComponentModel.DataAnnotations" /> | |||
<Reference Include="System" /> | |||
<Reference Include="System.Data" /> | |||
<Reference Include="System.Core" /> | |||
<Reference Include="System.Data.DataSetExtensions" /> | |||
<Reference Include="System.Web.Extensions" /> | |||
<Reference Include="System.Xml.Linq" /> | |||
<Reference Include="System.Drawing" /> | |||
<Reference Include="System.Web" /> | |||
<Reference Include="System.Xml" /> | |||
<Reference Include="System.Configuration" /> | |||
<Reference Include="System.Web.Services" /> | |||
<Reference Include="System.EnterpriseServices" /> | |||
<Reference Include="System.Web.DynamicData" /> | |||
<Reference Include="System.Web.Entity" /> | |||
<Reference Include="System.Web.ApplicationServices" /> | |||
<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> | |||
<Private>True</Private> | |||
<HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath> | |||
</Reference> | |||
<Reference Include="AspNet.ScriptManager.bootstrap"> | |||
<HintPath>..\packages\AspNet.ScriptManager.bootstrap.3.0.0\lib\net45\AspNet.ScriptManager.bootstrap.dll</HintPath> | |||
</Reference> | |||
<Reference Include="AspNet.ScriptManager.jQuery"> | |||
<HintPath>..\packages\AspNet.ScriptManager.jQuery.1.10.2\lib\net45\AspNet.ScriptManager.jQuery.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.ScriptManager.MSAjax"> | |||
<HintPath>..\packages\Microsoft.AspNet.ScriptManager.MSAjax.5.0.0\lib\net45\Microsoft.ScriptManager.MSAjax.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.ScriptManager.WebForms"> | |||
<HintPath>..\packages\Microsoft.AspNet.ScriptManager.WebForms.5.0.0\lib\net45\Microsoft.ScriptManager.WebForms.dll</HintPath> | |||
</Reference> | |||
<Reference Include="System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> | |||
<HintPath>..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll</HintPath> | |||
</Reference> | |||
<Reference Include="WebGrease"> | |||
<Private>True</Private> | |||
<HintPath>..\packages\WebGrease.1.5.2\lib\WebGrease.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Antlr3.Runtime"> | |||
<Private>True</Private> | |||
<HintPath>..\packages\Antlr.3.4.1.9004\lib\Antlr3.Runtime.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.AspNet.Web.Optimization.WebForms"> | |||
<Private>True</Private> | |||
<HintPath>..\packages\Microsoft.AspNet.Web.Optimization.WebForms.1.1.3\lib\net45\Microsoft.AspNet.Web.Optimization.WebForms.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.AspNet.FriendlyUrls"> | |||
<HintPath>..\packages\Microsoft.AspNet.FriendlyUrls.Core.1.0.2\lib\net45\Microsoft.AspNet.FriendlyUrls.dll</HintPath> | |||
</Reference> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Reference Include="Newtonsoft.Json"> | |||
<HintPath>..\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.ApplicationInsights"> | |||
<HintPath>..\packages\Microsoft.ApplicationInsights.2.2.0\lib\net45\Microsoft.ApplicationInsights.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.AI.Agent.Intercept"> | |||
<HintPath>..\packages\Microsoft.ApplicationInsights.Agent.Intercept.2.0.6\lib\net45\Microsoft.AI.Agent.Intercept.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.AI.DependencyCollector"> | |||
<HintPath>..\packages\Microsoft.ApplicationInsights.DependencyCollector.2.2.0\lib\net45\Microsoft.AI.DependencyCollector.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.AI.PerfCounterCollector"> | |||
<HintPath>..\packages\Microsoft.ApplicationInsights.PerfCounterCollector.2.2.0\lib\net45\Microsoft.AI.PerfCounterCollector.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.AI.ServerTelemetryChannel"> | |||
<HintPath>..\packages\Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.2.2.0\lib\net45\Microsoft.AI.ServerTelemetryChannel.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.AI.WindowsServer"> | |||
<HintPath>..\packages\Microsoft.ApplicationInsights.WindowsServer.2.2.0\lib\net45\Microsoft.AI.WindowsServer.dll</HintPath> | |||
</Reference> | |||
<Reference Include="Microsoft.AI.Web"> | |||
<HintPath>..\packages\Microsoft.ApplicationInsights.Web.2.2.0\lib\net45\Microsoft.AI.Web.dll</HintPath> | |||
</Reference> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Content Include="About.aspx" /> | |||
<Content Include="Contact.aspx" /> | |||
<Content Include="Content\bootstrap.css" /> | |||
<Content Include="Content\bootstrap.min.css" /> | |||
<Content Include="Content\fake_product_01.png" /> | |||
<Content Include="Content\fake_product_02.png" /> | |||
<Content Include="Content\fake_product_03.png" /> | |||
<Content Include="Content\fake_product_04.png" /> | |||
<Content Include="Content\fake_product_05.png" /> | |||
<Content Include="Content\Site.css" /> | |||
<Content Include="Default.aspx" /> | |||
<Content Include="favicon.ico" /> | |||
<Content Include="fonts\glyphicons-halflings-regular.svg" /> | |||
<Content Include="Global.asax" /> | |||
<Content Include="fonts\glyphicons-halflings-regular.woff" /> | |||
<Content Include="fonts\glyphicons-halflings-regular.ttf" /> | |||
<Content Include="fonts\glyphicons-halflings-regular.eot" /> | |||
<Content Include="ApplicationInsights.config"> | |||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | |||
</Content> | |||
<None Include="Dockerfile" /> | |||
<None Include="Properties\PublishProfiles\FolderProfile.pubxml" /> | |||
<None Include="Scripts\jquery-1.10.2.intellisense.js" /> | |||
<Content Include="Scripts\bootstrap.js" /> | |||
<Content Include="Scripts\bootstrap.min.js" /> | |||
<Content Include="Scripts\jquery-1.10.2.js" /> | |||
<Content Include="Scripts\jquery-1.10.2.min.js" /> | |||
<Content Include="Scripts\modernizr-2.6.2.js" /> | |||
<Content Include="Scripts\respond.js" /> | |||
<Content Include="Scripts\respond.min.js" /> | |||
<Content Include="Scripts\WebForms\DetailsView.js" /> | |||
<Content Include="Scripts\WebForms\Focus.js" /> | |||
<Content Include="Scripts\WebForms\GridView.js" /> | |||
<Content Include="Scripts\WebForms\Menu.js" /> | |||
<Content Include="Scripts\WebForms\MenuStandards.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjax.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxApplicationServices.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxComponentModel.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxCore.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxGlobalization.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxHistory.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxNetwork.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxSerialization.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxTimer.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxWebForms.js" /> | |||
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxWebServices.js" /> | |||
<Content Include="Scripts\WebForms\SmartNav.js" /> | |||
<Content Include="Scripts\WebForms\TreeView.js" /> | |||
<Content Include="Scripts\WebForms\WebForms.js" /> | |||
<Content Include="Scripts\WebForms\WebParts.js" /> | |||
<Content Include="Scripts\WebForms\WebUIValidation.js" /> | |||
<Content Include="Site.Master" /> | |||
<Content Include="ViewSwitcher.ascx" /> | |||
<Content Include="Web.config" /> | |||
<Content Include="Bundle.config" /> | |||
<Content Include="Site.Mobile.Master" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Compile Include="App_Start\BundleConfig.cs" /> | |||
<Compile Include="About.aspx.cs"> | |||
<DependentUpon>About.aspx</DependentUpon> | |||
<SubType>ASPXCodeBehind</SubType> | |||
</Compile> | |||
<Compile Include="About.aspx.designer.cs"> | |||
<DependentUpon>About.aspx</DependentUpon> | |||
</Compile> | |||
<Compile Include="App_Start\RouteConfig.cs" /> | |||
<Compile Include="Contact.aspx.cs"> | |||
<DependentUpon>Contact.aspx</DependentUpon> | |||
<SubType>ASPXCodeBehind</SubType> | |||
</Compile> | |||
<Compile Include="Contact.aspx.designer.cs"> | |||
<DependentUpon>Contact.aspx</DependentUpon> | |||
</Compile> | |||
<Compile Include="Default.aspx.cs"> | |||
<DependentUpon>Default.aspx</DependentUpon> | |||
<SubType>ASPXCodeBehind</SubType> | |||
</Compile> | |||
<Compile Include="Default.aspx.designer.cs"> | |||
<DependentUpon>Default.aspx</DependentUpon> | |||
</Compile> | |||
<Compile Include="Extensions\ObservableExtensions.cs" /> | |||
<Compile Include="Global.asax.cs"> | |||
<DependentUpon>Global.asax</DependentUpon> | |||
</Compile> | |||
<Compile Include="Models\CatalogBrand.cs" /> | |||
<Compile Include="Models\CatalogItem.cs" /> | |||
<Compile Include="Models\CatalogRoot.cs" /> | |||
<Compile Include="Models\CatalogType.cs" /> | |||
<Compile Include="Modules\AutoFacHttpModule.cs" /> | |||
<Compile Include="Properties\AssemblyInfo.cs" /> | |||
<Compile Include="Services\CatalogMockService.cs" /> | |||
<Compile Include="Services\CatalogService.cs" /> | |||
<Compile Include="Services\Common.cs" /> | |||
<Compile Include="Services\ICatalogService.cs" /> | |||
<Compile Include="Services\IRouteProvider.cs" /> | |||
<Compile Include="Site.Master.cs"> | |||
<DependentUpon>Site.Master</DependentUpon> | |||
<SubType>ASPXCodeBehind</SubType> | |||
</Compile> | |||
<Compile Include="Site.Master.designer.cs"> | |||
<DependentUpon>Site.Master</DependentUpon> | |||
</Compile> | |||
<Compile Include="Site.Mobile.Master.cs"> | |||
<DependentUpon>Site.Mobile.Master</DependentUpon> | |||
<SubType>ASPXCodeBehind</SubType> | |||
</Compile> | |||
<Compile Include="Site.Mobile.Master.designer.cs"> | |||
<DependentUpon>Site.Mobile.Master</DependentUpon> | |||
</Compile> | |||
<Compile Include="ViewSwitcher.ascx.cs"> | |||
<DependentUpon>ViewSwitcher.ascx</DependentUpon> | |||
<SubType>ASPXCodeBehind</SubType> | |||
</Compile> | |||
<Compile Include="ViewSwitcher.ascx.designer.cs"> | |||
<DependentUpon>ViewSwitcher.ascx</DependentUpon> | |||
</Compile> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Folder Include="App_Data\" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Content Include="packages.config" /> | |||
<Content Include="Scripts\jquery-1.10.2.min.map" /> | |||
<None Include="Web.Debug.config"> | |||
<DependentUpon>Web.config</DependentUpon> | |||
</None> | |||
<None Include="Web.Release.config"> | |||
<DependentUpon>Web.config</DependentUpon> | |||
</None> | |||
</ItemGroup> | |||
<PropertyGroup> | |||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> | |||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> | |||
</PropertyGroup> | |||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> | |||
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> | |||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" /> | |||
<ProjectExtensions> | |||
<VisualStudio> | |||
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}"> | |||
<WebProjectProperties> | |||
<UseIIS>True</UseIIS> | |||
<AutoAssignPort>True</AutoAssignPort> | |||
<DevelopmentServerPort>58178</DevelopmentServerPort> | |||
<DevelopmentServerVPath>/</DevelopmentServerVPath> | |||
<IISUrl>http://localhost:58178/</IISUrl> | |||
<NTLMAuthentication>False</NTLMAuthentication> | |||
<UseCustomServer>False</UseCustomServer> | |||
<CustomServerUrl> | |||
</CustomServerUrl> | |||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile> | |||
</WebProjectProperties> | |||
</FlavorProperties> | |||
</VisualStudio> | |||
</ProjectExtensions> | |||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> | |||
<PropertyGroup> | |||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> | |||
</PropertyGroup> | |||
<Error Condition="!Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" /> | |||
<Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.2.0.1\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.2.0.1\build\Microsoft.Net.Compilers.props'))" /> | |||
</Target> | |||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. | |||
Other similar extension points exist, see Microsoft.Common.targets. | |||
<Target Name="BeforeBuild"> | |||
</Target> | |||
<Target Name="AfterBuild"> | |||
</Target> | |||
--> | |||
</Project> |
@ -1,45 +0,0 @@ | |||
using Autofac; | |||
using Autofac.Core; | |||
using eShopOnContainers.Core.Models.Catalog; | |||
using eShopOnContainers.Core.Services.Catalog; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
using System.Web; | |||
using System.Web.UI; | |||
using System.Web.UI.WebControls; | |||
namespace Microsoft.eShopOnContainers.Catalog.WebForms | |||
{ | |||
public partial class _Default : Page | |||
{ | |||
private ICatalogService catalog; | |||
protected _Default() { } | |||
public _Default(ICatalogService catalog) | |||
{ | |||
this.catalog = catalog; | |||
} | |||
protected override void OnLoad(EventArgs e) | |||
{ | |||
RegisterAsyncTask(new PageAsyncTask(LoadCatalogDataAsync)); | |||
base.OnLoad(e); | |||
} | |||
private async Task LoadCatalogDataAsync() | |||
{ | |||
var collection = await catalog?.GetCatalogAsync(); | |||
catalogList.DataSource = collection; | |||
catalogList.DataBind(); | |||
} | |||
protected void Page_Load(object sender, EventArgs e) | |||
{ | |||
} | |||
} | |||
} |
@ -1,19 +0,0 @@ | |||
using System; | |||
using System.Web; | |||
using System.Web.Optimization; | |||
using System.Web.Routing; | |||
namespace Microsoft.eShopOnContainers.Catalog.WebForms | |||
{ | |||
public class Global : HttpApplication | |||
{ | |||
void Application_Start(object sender, EventArgs e) | |||
{ | |||
// Code that runs on application startup | |||
RouteConfig.RegisterRoutes(RouteTable.Routes); | |||
BundleConfig.RegisterBundles(BundleTable.Bundles); | |||
} | |||
} | |||
} |
@ -1,83 +0,0 @@ | |||
using Autofac; | |||
using eShopOnContainers.Core.Services.Catalog; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Web; | |||
using System.Web.Configuration; | |||
using System.Web.UI; | |||
namespace Microsoft.eShopOnContainers.Catalog.WebForms.Modules | |||
{ | |||
// Using DI with WebForms is not yet implemented. | |||
// This implementation has been adapted from this post: | |||
// https://blogs.msdn.microsoft.com/webdev/2016/10/19/modern-asp-net-web-forms-development-dependency-injection/ | |||
public class AutoFacHttpModule : IHttpModule | |||
{ | |||
private static IContainer Container => lazyContainer.Value; | |||
private static Lazy<IContainer> lazyContainer = new Lazy<IContainer>(() => CreateContainer()); | |||
private static IContainer CreateContainer() | |||
{ | |||
// Configure AutoFac: | |||
// Register Containers: | |||
var settings = WebConfigurationManager.AppSettings; | |||
var useFake = settings["usefake"]; | |||
bool fake = useFake == "true"; | |||
var builder = new ContainerBuilder(); | |||
if (fake) | |||
{ | |||
builder.RegisterType<CatalogMockService>() | |||
.As<ICatalogService>(); | |||
} | |||
else | |||
{ | |||
builder.RegisterType<CatalogMockService>() | |||
.As<ICatalogService>(); | |||
} | |||
var container = builder.Build(); | |||
return container; | |||
} | |||
public void Dispose() | |||
{ | |||
Container.Dispose(); | |||
} | |||
public void Init(HttpApplication context) | |||
{ | |||
context.PreRequestHandlerExecute += (_, __) => InjectDependencies(); | |||
} | |||
private void InjectDependencies() | |||
{ | |||
if (HttpContext.Current.CurrentHandler is Page page) | |||
{ | |||
// Get the code-behind class that we may have written | |||
var pageType = page.GetType().BaseType; | |||
// Determine if there is a constructor to inject, and grab it | |||
var ctor = (from c in pageType.GetConstructors() | |||
where c.GetParameters().Length > 0 | |||
select c).FirstOrDefault(); | |||
if (ctor != null) | |||
{ | |||
// Resolve the parameters for the constructor | |||
var args = (from parm in ctor.GetParameters() | |||
select Container.Resolve(parm.ParameterType)) | |||
.ToArray(); | |||
// Execute the constructor method with the arguments resolved | |||
ctor.Invoke(page, args); | |||
} | |||
// Use the Autofac method to inject any properties that can be filled by Autofac | |||
Container.InjectProperties(page); | |||
} | |||
} | |||
} | |||
} |
@ -1,54 +0,0 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<!-- | |||
For more information on how to configure your ASP.NET application, please visit | |||
https://go.microsoft.com/fwlink/?LinkId=169433 | |||
--> | |||
<configuration> | |||
<appSettings> | |||
<add key="usefake" value="true" /> | |||
</appSettings> | |||
<system.web> | |||
<compilation debug="true" targetFramework="4.5.2" /> | |||
<httpRuntime targetFramework="4.5.2" /> | |||
<pages> | |||
<namespaces> | |||
<add namespace="System.Web.Optimization" /> | |||
</namespaces> | |||
<controls> | |||
<add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" /> | |||
</controls> | |||
</pages> | |||
<httpModules> | |||
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" /> | |||
<!-- Use this if you are on IIS 7 and earlier --> | |||
<add name="InjectModule" type="Microsoft.eShopOnContainers.Catalog.WebForms.Modules.AutoFacHttpModule, Catalog.WebForms" /> | |||
</httpModules> | |||
</system.web> | |||
<runtime> | |||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> | |||
<dependentAssembly> | |||
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" /> | |||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> | |||
</dependentAssembly> | |||
<dependentAssembly> | |||
<assemblyIdentity name="WebGrease" culture="neutral" publicKeyToken="31bf3856ad364e35" /> | |||
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /> | |||
</dependentAssembly> | |||
</assemblyBinding> | |||
</runtime> | |||
<system.webServer> | |||
<validation validateIntegratedModeConfiguration="false" /> | |||
<modules> | |||
<remove name="ApplicationInsightsWebTracking" /> | |||
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" /> | |||
<!-- Use this if you are on IIS 8 and later --> | |||
<add name="InjectModule" type="Microsoft.eShopOnContainers.Catalog.WebForms.Modules.AutoFacHttpModule, Catalog.WebForms" /> | |||
</modules> | |||
</system.webServer> | |||
<system.codedom> | |||
<compilers> | |||
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" /> | |||
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" /> | |||
</compilers> | |||
</system.codedom> | |||
</configuration> |
@ -1,29 +0,0 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<packages> | |||
<package id="Antlr" version="3.4.1.9004" targetFramework="net452" /> | |||
<package id="AspNet.ScriptManager.bootstrap" version="3.0.0" targetFramework="net452" /> | |||
<package id="AspNet.ScriptManager.jQuery" version="1.10.2" targetFramework="net452" /> | |||
<package id="Autofac" version="4.3.0" targetFramework="net452" /> | |||
<package id="bootstrap" version="3.0.0" targetFramework="net452" /> | |||
<package id="jQuery" version="1.10.2" targetFramework="net452" /> | |||
<package id="Microsoft.ApplicationInsights" version="2.2.0" targetFramework="net452" /> | |||
<package id="Microsoft.ApplicationInsights.Agent.Intercept" version="2.0.6" targetFramework="net452" /> | |||
<package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.2.0" targetFramework="net452" /> | |||
<package id="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.2.0" targetFramework="net452" /> | |||
<package id="Microsoft.ApplicationInsights.Web" version="2.2.0" targetFramework="net452" /> | |||
<package id="Microsoft.ApplicationInsights.WindowsServer" version="2.2.0" targetFramework="net452" /> | |||
<package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.2.0" targetFramework="net452" /> | |||
<package id="Microsoft.AspNet.FriendlyUrls" version="1.0.2" targetFramework="net452" /> | |||
<package id="Microsoft.AspNet.FriendlyUrls.Core" version="1.0.2" targetFramework="net452" /> | |||
<package id="Microsoft.AspNet.ScriptManager.MSAjax" version="5.0.0" targetFramework="net452" /> | |||
<package id="Microsoft.AspNet.ScriptManager.WebForms" version="5.0.0" targetFramework="net452" /> | |||
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net452" /> | |||
<package id="Microsoft.AspNet.Web.Optimization.WebForms" version="1.1.3" targetFramework="net452" /> | |||
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.3" targetFramework="net452" /> | |||
<package id="Microsoft.Net.Compilers" version="2.0.1" targetFramework="net452" developmentDependency="true" /> | |||
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net452" /> | |||
<package id="Modernizr" version="2.6.2" targetFramework="net452" /> | |||
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" /> | |||
<package id="Respond" version="1.2.0" targetFramework="net452" /> | |||
<package id="WebGrease" version="1.5.2" targetFramework="net452" /> | |||
</packages> |
@ -1,9 +0,0 @@ | |||
version: '2' | |||
services: | |||
ci-build: | |||
image: microsoft/aspnetcore-build:1.0-1.1 | |||
volumes: | |||
- .:/src | |||
working_dir: /src | |||
command: /bin/bash -c "dotnet restore ./eShopWeb.sln && dotnet publish ./eShopWeb.sln -c Release -o ./obj/Docker/publish" |
@ -1,22 +0,0 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<Project ToolsVersion="15.0" Sdk="Microsoft.Docker.Sdk"> | |||
<PropertyGroup Label="Globals"> | |||
<ProjectGuid>91cd7b6e-a849-48c1-b058-4bc47c4cd978</ProjectGuid> | |||
<DockerLaunchBrowser>True</DockerLaunchBrowser> | |||
<DockerServiceUrl>http://localhost:{ServicePort}</DockerServiceUrl> | |||
<DockerServiceName>eshopweb</DockerServiceName> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<None Include="docker-compose.ci.build.yml" /> | |||
<None Include="docker-compose.override.yml"> | |||
<DependentUpon>docker-compose.yml</DependentUpon> | |||
</None> | |||
<None Include="docker-compose.vs.debug.yml"> | |||
<DependentUpon>docker-compose.yml</DependentUpon> | |||
</None> | |||
<None Include="docker-compose.vs.release.yml"> | |||
<DependentUpon>docker-compose.yml</DependentUpon> | |||
</None> | |||
<None Include="docker-compose.yml" /> | |||
</ItemGroup> | |||
</Project> |
@ -1,17 +0,0 @@ | |||
version: '2' | |||
services: | |||
eshopweb: | |||
environment: | |||
- ASPNETCORE_ENVIRONMENT=Development | |||
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word | |||
- CatalogBaseUrl=http://localhost:5106 | |||
ports: | |||
- "5106:5106" | |||
sql.data: | |||
environment: | |||
- MSSQL_SA_PASSWORD=Pass@word | |||
- ACCEPT_EULA=Y | |||
ports: | |||
- "5433:1433" |
@ -1,17 +0,0 @@ | |||
version: '2' | |||
services: | |||
eshopweb: | |||
image: eshop/web:dev | |||
build: | |||
args: | |||
source: ${DOCKER_BUILD_SOURCE} | |||
environment: | |||
- DOTNET_USE_POLLING_FILE_WATCHER=1 | |||
volumes: | |||
- ./eShopWeb:/app | |||
- ~/.nuget/packages:/root/.nuget/packages:ro | |||
- ~/clrdbg:/clrdbg:ro | |||
entrypoint: tail -f /dev/null | |||
labels: | |||
- "com.microsoft.visualstudio.targetoperatingsystem=linux" |
@ -1,12 +0,0 @@ | |||
version: '2' | |||
services: | |||
eshopweb: | |||
build: | |||
args: | |||
source: ${DOCKER_BUILD_SOURCE} | |||
volumes: | |||
- ~/clrdbg:/clrdbg:ro | |||
entrypoint: tail -f /dev/null | |||
labels: | |||
- "com.microsoft.visualstudio.targetoperatingsystem=linux" |
@ -1,12 +0,0 @@ | |||
version: '2' | |||
services: | |||
eshopweb: | |||
image: eshop/web | |||
build: | |||
context: ./eShopWeb | |||
dockerfile: Dockerfile | |||
depends_on: | |||
- sql.data | |||
sql.data: | |||
image: microsoft/mssql-server-linux:2017-latest |
@ -1,48 +0,0 @@ | |||
| |||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||
# Visual Studio 15 | |||
VisualStudioVersion = 15.0.26228.0 | |||
MinimumVisualStudioVersion = 10.0.40219.1 | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopWeb", "eShopWeb\eShopWeb.csproj", "{CA5B730B-7195-4E29-B030-A2007E004B98}" | |||
EndProject | |||
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{91CD7B6E-A849-48C1-B058-4BC47C4CD978}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
Debug|x64 = Debug|x64 | |||
Debug|x86 = Debug|x86 | |||
Release|Any CPU = Release|Any CPU | |||
Release|x64 = Release|x64 | |||
Release|x86 = Release|x86 | |||
EndGlobalSection | |||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Debug|x64.ActiveCfg = Debug|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Debug|x64.Build.0 = Debug|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Debug|x86.ActiveCfg = Debug|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Debug|x86.Build.0 = Debug|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Release|x64.ActiveCfg = Release|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Release|x64.Build.0 = Release|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Release|x86.ActiveCfg = Release|Any CPU | |||
{CA5B730B-7195-4E29-B030-A2007E004B98}.Release|x86.Build.0 = Release|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Debug|x64.ActiveCfg = Debug|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Debug|x64.Build.0 = Debug|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Debug|x86.ActiveCfg = Debug|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Debug|x86.Build.0 = Debug|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Release|x64.ActiveCfg = Release|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Release|x64.Build.0 = Release|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Release|x86.ActiveCfg = Release|Any CPU | |||
{91CD7B6E-A849-48C1-B058-4BC47C4CD978}.Release|x86.Build.0 = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(SolutionProperties) = preSolution | |||
HideSolutionNode = FALSE | |||
EndGlobalSection | |||
EndGlobal |
@ -1,3 +0,0 @@ | |||
{ | |||
"directory": "wwwroot/lib" | |||
} |
@ -1,7 +0,0 @@ | |||
namespace Microsoft.eShopWeb | |||
{ | |||
public class CatalogSettings | |||
{ | |||
public string CatalogBaseUrl { get; set; } | |||
} | |||
} |
@ -1,70 +0,0 @@ | |||
using Microsoft.eShopWeb.Services; | |||
using Microsoft.eShopWeb.ViewModels; | |||
using Microsoft.AspNetCore.Hosting; | |||
using Microsoft.AspNetCore.Mvc; | |||
using System; | |||
using System.IO; | |||
using System.Threading.Tasks; | |||
// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 | |||
namespace Microsoft.eShopWeb.Controllers | |||
{ | |||
public class CatalogController : Controller | |||
{ | |||
private readonly IHostingEnvironment _env; | |||
private readonly ICatalogService _catalogSvc; | |||
public CatalogController(IHostingEnvironment env, ICatalogService catalogSvc) | |||
{ | |||
_env = env; | |||
_catalogSvc = catalogSvc; | |||
} | |||
// GET: /<controller>/ | |||
public async Task<IActionResult> Index(int? BrandFilterApplied, int? TypesFilterApplied, int? page) | |||
{ | |||
var itemsPage = 10; | |||
var catalog = await _catalogSvc.GetCatalogItems(page ?? 0, itemsPage, BrandFilterApplied, TypesFilterApplied); | |||
var vm = new CatalogIndex() | |||
{ | |||
CatalogItems = catalog.Data, | |||
Brands = await _catalogSvc.GetBrands(), | |||
Types = await _catalogSvc.GetTypes(), | |||
BrandFilterApplied = BrandFilterApplied ?? 0, | |||
TypesFilterApplied = TypesFilterApplied ?? 0, | |||
PaginationInfo = new PaginationInfo() | |||
{ | |||
ActualPage = page ?? 0, | |||
ItemsPerPage = catalog.Data.Count, | |||
TotalItems = catalog.Count, | |||
TotalPages = int.Parse(Math.Ceiling(((decimal)catalog.Count / itemsPage)).ToString()) | |||
} | |||
}; | |||
vm.PaginationInfo.Next = (vm.PaginationInfo.ActualPage == vm.PaginationInfo.TotalPages - 1) ? "is-disabled" : ""; | |||
vm.PaginationInfo.Previous = (vm.PaginationInfo.ActualPage == 0) ? "is-disabled" : ""; | |||
return View(vm); | |||
} | |||
[HttpGet("{id}")] | |||
[Route("[controller]/pic/{id}")] | |||
// GET: /<controller>/pic/{id} | |||
public IActionResult GetImage(int id) | |||
{ | |||
var contentRoot = _env.ContentRootPath + "//Pics"; | |||
var path = Path.Combine(contentRoot, id + ".png"); | |||
Byte[] b = System.IO.File.ReadAllBytes(path); | |||
return File(b, "image/png"); | |||
} | |||
public IActionResult Error() | |||
{ | |||
return View(); | |||
} | |||
} | |||
} |
@ -1,6 +0,0 @@ | |||
FROM microsoft/aspnetcore:1.1 | |||
ARG source | |||
WORKDIR /app | |||
EXPOSE 80 | |||
COPY ${source:-obj/Docker/publish} . | |||
ENTRYPOINT ["dotnet", "eShopWeb.dll"] |
@ -1,79 +0,0 @@ | |||
namespace Microsoft.eShopWeb.Infrastructure | |||
{ | |||
using eShopWeb.Models; | |||
using Microsoft.EntityFrameworkCore; | |||
using Microsoft.EntityFrameworkCore.Metadata.Builders; | |||
public class CatalogContext : DbContext | |||
{ | |||
public CatalogContext(DbContextOptions options) : base(options) | |||
{ | |||
} | |||
public DbSet<CatalogItem> CatalogItems { get; set; } | |||
public DbSet<CatalogBrand> CatalogBrands { get; set; } | |||
public DbSet<CatalogType> CatalogTypes { get; set; } | |||
protected override void OnModelCreating(ModelBuilder builder) | |||
{ | |||
builder.Entity<CatalogBrand>(ConfigureCatalogBrand); | |||
builder.Entity<CatalogType>(ConfigureCatalogType); | |||
builder.Entity<CatalogItem>(ConfigureCatalogItem); | |||
} | |||
void ConfigureCatalogItem(EntityTypeBuilder<CatalogItem> builder) | |||
{ | |||
builder.ToTable("Catalog"); | |||
builder.Property(ci => ci.Id) | |||
.ForSqlServerUseSequenceHiLo("catalog_hilo") | |||
.IsRequired(); | |||
builder.Property(ci => ci.Name) | |||
.IsRequired(true) | |||
.HasMaxLength(50); | |||
builder.Property(ci => ci.Price) | |||
.IsRequired(true); | |||
builder.Property(ci => ci.PictureUri) | |||
.IsRequired(false); | |||
builder.HasOne(ci => ci.CatalogBrand) | |||
.WithMany() | |||
.HasForeignKey(ci => ci.CatalogBrandId); | |||
builder.HasOne(ci => ci.CatalogType) | |||
.WithMany() | |||
.HasForeignKey(ci => ci.CatalogTypeId); | |||
} | |||
void ConfigureCatalogBrand(EntityTypeBuilder<CatalogBrand> builder) | |||
{ | |||
builder.ToTable("CatalogBrand"); | |||
builder.HasKey(ci => ci.Id); | |||
builder.Property(ci => ci.Id) | |||
.ForSqlServerUseSequenceHiLo("catalog_brand_hilo") | |||
.IsRequired(); | |||
builder.Property(cb => cb.Brand) | |||
.IsRequired() | |||
.HasMaxLength(100); | |||
} | |||
void ConfigureCatalogType(EntityTypeBuilder<CatalogType> builder) | |||
{ | |||
builder.ToTable("CatalogType"); | |||
builder.HasKey(ci => ci.Id); | |||
builder.Property(ci => ci.Id) | |||
.ForSqlServerUseSequenceHiLo("catalog_type_hilo") | |||
.IsRequired(); | |||
builder.Property(cb => cb.Type) | |||
.IsRequired() | |||
.HasMaxLength(100); | |||
} | |||
} | |||
} |
@ -1,102 +0,0 @@ | |||
namespace Microsoft.eShopWeb.Infrastructure | |||
{ | |||
using eShopWeb.Models; | |||
using Microsoft.AspNetCore.Builder; | |||
using Microsoft.EntityFrameworkCore; | |||
using Microsoft.Extensions.Logging; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
public class CatalogContextSeed | |||
{ | |||
public static async Task SeedAsync(IApplicationBuilder applicationBuilder, ILoggerFactory loggerFactory, int? retry = 0) | |||
{ | |||
int retryForAvaiability = retry.Value; | |||
try | |||
{ | |||
var context = (CatalogContext)applicationBuilder | |||
.ApplicationServices.GetService(typeof(CatalogContext)); | |||
context.Database.Migrate(); | |||
if (!context.CatalogBrands.Any()) | |||
{ | |||
context.CatalogBrands.AddRange( | |||
GetPreconfiguredCatalogBrands()); | |||
await context.SaveChangesAsync(); | |||
} | |||
if (!context.CatalogTypes.Any()) | |||
{ | |||
context.CatalogTypes.AddRange( | |||
GetPreconfiguredCatalogTypes()); | |||
await context.SaveChangesAsync(); | |||
} | |||
if (!context.CatalogItems.Any()) | |||
{ | |||
context.CatalogItems.AddRange( | |||
GetPreconfiguredItems()); | |||
await context.SaveChangesAsync(); | |||
} | |||
} | |||
catch (Exception ex) | |||
{ | |||
if (retryForAvaiability < 10) | |||
{ | |||
retryForAvaiability++; | |||
var log = loggerFactory.CreateLogger("catalog seed"); | |||
log.LogError(ex, "EXCEPTION ERROR: {Message}", ex.Message); | |||
await SeedAsync(applicationBuilder, loggerFactory, retryForAvaiability); | |||
} | |||
} | |||
} | |||
static IEnumerable<CatalogBrand> GetPreconfiguredCatalogBrands() | |||
{ | |||
return new List<CatalogBrand>() | |||
{ | |||
new CatalogBrand() { Brand = "Azure"}, | |||
new CatalogBrand() { Brand = ".NET" }, | |||
new CatalogBrand() { Brand = "Visual Studio" }, | |||
new CatalogBrand() { Brand = "SQL Server" }, | |||
new CatalogBrand() { Brand = "Other" } | |||
}; | |||
} | |||
static IEnumerable<CatalogType> GetPreconfiguredCatalogTypes() | |||
{ | |||
return new List<CatalogType>() | |||
{ | |||
new CatalogType() { Type = "Mug"}, | |||
new CatalogType() { Type = "T-Shirt" }, | |||
new CatalogType() { Type = "Sheet" }, | |||
new CatalogType() { Type = "USB Memory Stick" } | |||
}; | |||
} | |||
static IEnumerable<CatalogItem> GetPreconfiguredItems() | |||
{ | |||
return new List<CatalogItem>() | |||
{ | |||
new CatalogItem() { CatalogTypeId=2,CatalogBrandId=2, Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = 19.5M, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/1" }, | |||
new CatalogItem() { CatalogTypeId=1,CatalogBrandId=2, Description = ".NET Black & White Mug", Name = ".NET Black & White Mug", Price= 8.50M, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/2" }, | |||
new CatalogItem() { CatalogTypeId=2,CatalogBrandId=5, Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/3" }, | |||
new CatalogItem() { CatalogTypeId=2,CatalogBrandId=2, Description = ".NET Foundation Sweatshirt", Name = ".NET Foundation Sweatshirt", Price = 12, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/4" }, | |||
new CatalogItem() { CatalogTypeId=3,CatalogBrandId=5, Description = "Roslyn Red Sheet", Name = "Roslyn Red Sheet", Price = 8.5M, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/5" }, | |||
new CatalogItem() { CatalogTypeId=2,CatalogBrandId=2, Description = ".NET Blue Sweatshirt", Name = ".NET Blue Sweatshirt", Price = 12, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/6" }, | |||
new CatalogItem() { CatalogTypeId=2,CatalogBrandId=5, Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/7" }, | |||
new CatalogItem() { CatalogTypeId=2,CatalogBrandId=5, Description = "Kudu Purple Sweatshirt", Name = "Kudu Purple Sweatshirt", Price = 8.5M, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/8" }, | |||
new CatalogItem() { CatalogTypeId=1,CatalogBrandId=5, Description = "Cup<T> White Mug", Name = "Cup<T> White Mug", Price = 12, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/9" }, | |||
new CatalogItem() { CatalogTypeId=3,CatalogBrandId=2, Description = ".NET Foundation Sheet", Name = ".NET Foundation Sheet", Price = 12, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/10" }, | |||
new CatalogItem() { CatalogTypeId=3,CatalogBrandId=2, Description = "Cup<T> Sheet", Name = "Cup<T> Sheet", Price = 8.5M, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/11" }, | |||
new CatalogItem() { CatalogTypeId=2,CatalogBrandId=5, Description = "Prism White TShirt", Name = "Prism White TShirt", Price = 12, PictureUri = "http://catalogbaseurltobereplaced/catalog/pic/12" } | |||
}; | |||
} | |||
} | |||
} |
@ -1,97 +0,0 @@ | |||
using Microsoft.EntityFrameworkCore; | |||
using Microsoft.EntityFrameworkCore.Infrastructure; | |||
using Microsoft.EntityFrameworkCore.Metadata; | |||
using Microsoft.EntityFrameworkCore.Migrations; | |||
namespace Microsoft.eShopWeb.Infrastructure.Migrations | |||
{ | |||
[DbContext(typeof(CatalogContext))] | |||
[Migration("20170302162241_Initial")] | |||
partial class Initial | |||
{ | |||
protected override void BuildTargetModel(ModelBuilder modelBuilder) | |||
{ | |||
modelBuilder | |||
.HasAnnotation("ProductVersion", "1.1.0-rtm-22752") | |||
.HasAnnotation("SqlServer:Sequence:.catalog_brand_hilo", "'catalog_brand_hilo', '', '1', '10', '', '', 'Int64', 'False'") | |||
.HasAnnotation("SqlServer:Sequence:.catalog_hilo", "'catalog_hilo', '', '1', '10', '', '', 'Int64', 'False'") | |||
.HasAnnotation("SqlServer:Sequence:.catalog_type_hilo", "'catalog_type_hilo', '', '1', '10', '', '', 'Int64', 'False'") | |||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); | |||
modelBuilder.Entity("eShopWeb.Models.CatalogBrand", b => | |||
{ | |||
b.Property<int>("Id") | |||
.ValueGeneratedOnAdd() | |||
.HasAnnotation("SqlServer:HiLoSequenceName", "catalog_brand_hilo") | |||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); | |||
b.Property<string>("Brand") | |||
.IsRequired() | |||
.HasMaxLength(100); | |||
b.HasKey("Id"); | |||
b.ToTable("CatalogBrand"); | |||
}); | |||
modelBuilder.Entity("eShopWeb.Models.CatalogItem", b => | |||
{ | |||
b.Property<int>("Id") | |||
.ValueGeneratedOnAdd() | |||
.HasAnnotation("SqlServer:HiLoSequenceName", "catalog_hilo") | |||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); | |||
b.Property<int>("CatalogBrandId"); | |||
b.Property<int>("CatalogTypeId"); | |||
b.Property<string>("Description"); | |||
b.Property<string>("Name") | |||
.IsRequired() | |||
.HasMaxLength(50); | |||
b.Property<string>("PictureUri"); | |||
b.Property<decimal>("Price"); | |||
b.HasKey("Id"); | |||
b.HasIndex("CatalogBrandId"); | |||
b.HasIndex("CatalogTypeId"); | |||
b.ToTable("Catalog"); | |||
}); | |||
modelBuilder.Entity("eShopWeb.Models.CatalogType", b => | |||
{ | |||
b.Property<int>("Id") | |||
.ValueGeneratedOnAdd() | |||
.HasAnnotation("SqlServer:HiLoSequenceName", "catalog_type_hilo") | |||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); | |||
b.Property<string>("Type") | |||
.IsRequired() | |||
.HasMaxLength(100); | |||
b.HasKey("Id"); | |||
b.ToTable("CatalogType"); | |||
}); | |||
modelBuilder.Entity("eShopWeb.Models.CatalogItem", b => | |||
{ | |||
b.HasOne("eShopWeb.Models.CatalogBrand", "CatalogBrand") | |||
.WithMany() | |||
.HasForeignKey("CatalogBrandId") | |||
.OnDelete(DeleteBehavior.Cascade); | |||
b.HasOne("eShopWeb.Models.CatalogType", "CatalogType") | |||
.WithMany() | |||
.HasForeignKey("CatalogTypeId") | |||
.OnDelete(DeleteBehavior.Cascade); | |||
}); | |||
} | |||
} | |||
} |
@ -1,108 +0,0 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using Microsoft.EntityFrameworkCore.Migrations; | |||
namespace Microsoft.eShopWeb.Infrastructure.Migrations | |||
{ | |||
public partial class Initial : Migration | |||
{ | |||
protected override void Up(MigrationBuilder migrationBuilder) | |||
{ | |||
migrationBuilder.CreateSequence( | |||
name: "catalog_brand_hilo", | |||
incrementBy: 10); | |||
migrationBuilder.CreateSequence( | |||
name: "catalog_hilo", | |||
incrementBy: 10); | |||
migrationBuilder.CreateSequence( | |||
name: "catalog_type_hilo", | |||
incrementBy: 10); | |||
migrationBuilder.CreateTable( | |||
name: "CatalogBrand", | |||
columns: table => new | |||
{ | |||
Id = table.Column<int>(nullable: false), | |||
Brand = table.Column<string>(maxLength: 100, nullable: false) | |||
}, | |||
constraints: table => | |||
{ | |||
table.PrimaryKey("PK_CatalogBrand", x => x.Id); | |||
}); | |||
migrationBuilder.CreateTable( | |||
name: "CatalogType", | |||
columns: table => new | |||
{ | |||
Id = table.Column<int>(nullable: false), | |||
Type = table.Column<string>(maxLength: 100, nullable: false) | |||
}, | |||
constraints: table => | |||
{ | |||
table.PrimaryKey("PK_CatalogType", x => x.Id); | |||
}); | |||
migrationBuilder.CreateTable( | |||
name: "Catalog", | |||
columns: table => new | |||
{ | |||
Id = table.Column<int>(nullable: false), | |||
CatalogBrandId = table.Column<int>(nullable: false), | |||
CatalogTypeId = table.Column<int>(nullable: false), | |||
Description = table.Column<string>(nullable: true), | |||
Name = table.Column<string>(maxLength: 50, nullable: false), | |||
PictureUri = table.Column<string>(nullable: true), | |||
Price = table.Column<decimal>(nullable: false) | |||
}, | |||
constraints: table => | |||
{ | |||
table.PrimaryKey("PK_Catalog", x => x.Id); | |||
table.ForeignKey( | |||
name: "FK_Catalog_CatalogBrand_CatalogBrandId", | |||
column: x => x.CatalogBrandId, | |||
principalTable: "CatalogBrand", | |||
principalColumn: "Id", | |||
onDelete: ReferentialAction.Cascade); | |||
table.ForeignKey( | |||
name: "FK_Catalog_CatalogType_CatalogTypeId", | |||
column: x => x.CatalogTypeId, | |||
principalTable: "CatalogType", | |||
principalColumn: "Id", | |||
onDelete: ReferentialAction.Cascade); | |||
}); | |||
migrationBuilder.CreateIndex( | |||
name: "IX_Catalog_CatalogBrandId", | |||
table: "Catalog", | |||
column: "CatalogBrandId"); | |||
migrationBuilder.CreateIndex( | |||
name: "IX_Catalog_CatalogTypeId", | |||
table: "Catalog", | |||
column: "CatalogTypeId"); | |||
} | |||
protected override void Down(MigrationBuilder migrationBuilder) | |||
{ | |||
migrationBuilder.DropTable( | |||
name: "Catalog"); | |||
migrationBuilder.DropTable( | |||
name: "CatalogBrand"); | |||
migrationBuilder.DropTable( | |||
name: "CatalogType"); | |||
migrationBuilder.DropSequence( | |||
name: "catalog_brand_hilo"); | |||
migrationBuilder.DropSequence( | |||
name: "catalog_hilo"); | |||
migrationBuilder.DropSequence( | |||
name: "catalog_type_hilo"); | |||
} | |||
} | |||
} |
@ -1,95 +0,0 @@ | |||
using Microsoft.EntityFrameworkCore; | |||
using Microsoft.EntityFrameworkCore.Infrastructure; | |||
using Microsoft.EntityFrameworkCore.Metadata; | |||
namespace Microsoft.eShopWeb.Infrastructure.Migrations | |||
{ | |||
[DbContext(typeof(CatalogContext))] | |||
partial class CatalogContextModelSnapshot : ModelSnapshot | |||
{ | |||
protected override void BuildModel(ModelBuilder modelBuilder) | |||
{ | |||
modelBuilder | |||
.HasAnnotation("ProductVersion", "1.1.0-rtm-22752") | |||
.HasAnnotation("SqlServer:Sequence:.catalog_brand_hilo", "'catalog_brand_hilo', '', '1', '10', '', '', 'Int64', 'False'") | |||
.HasAnnotation("SqlServer:Sequence:.catalog_hilo", "'catalog_hilo', '', '1', '10', '', '', 'Int64', 'False'") | |||
.HasAnnotation("SqlServer:Sequence:.catalog_type_hilo", "'catalog_type_hilo', '', '1', '10', '', '', 'Int64', 'False'") | |||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); | |||
modelBuilder.Entity("eShopWeb.Models.CatalogBrand", b => | |||
{ | |||
b.Property<int>("Id") | |||
.ValueGeneratedOnAdd() | |||
.HasAnnotation("SqlServer:HiLoSequenceName", "catalog_brand_hilo") | |||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); | |||
b.Property<string>("Brand") | |||
.IsRequired() | |||
.HasMaxLength(100); | |||
b.HasKey("Id"); | |||
b.ToTable("CatalogBrand"); | |||
}); | |||
modelBuilder.Entity("eShopWeb.Models.CatalogItem", b => | |||
{ | |||
b.Property<int>("Id") | |||
.ValueGeneratedOnAdd() | |||
.HasAnnotation("SqlServer:HiLoSequenceName", "catalog_hilo") | |||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); | |||
b.Property<int>("CatalogBrandId"); | |||
b.Property<int>("CatalogTypeId"); | |||
b.Property<string>("Description"); | |||
b.Property<string>("Name") | |||
.IsRequired() | |||
.HasMaxLength(50); | |||
b.Property<string>("PictureUri"); | |||
b.Property<decimal>("Price"); | |||
b.HasKey("Id"); | |||
b.HasIndex("CatalogBrandId"); | |||
b.HasIndex("CatalogTypeId"); | |||
b.ToTable("Catalog"); | |||
}); | |||
modelBuilder.Entity("eShopWeb.Models.CatalogType", b => | |||
{ | |||
b.Property<int>("Id") | |||
.ValueGeneratedOnAdd() | |||
.HasAnnotation("SqlServer:HiLoSequenceName", "catalog_type_hilo") | |||
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); | |||
b.Property<string>("Type") | |||
.IsRequired() | |||
.HasMaxLength(100); | |||
b.HasKey("Id"); | |||
b.ToTable("CatalogType"); | |||
}); | |||
modelBuilder.Entity("eShopWeb.Models.CatalogItem", b => | |||
{ | |||
b.HasOne("eShopWeb.Models.CatalogBrand", "CatalogBrand") | |||
.WithMany() | |||
.HasForeignKey("CatalogBrandId") | |||
.OnDelete(DeleteBehavior.Cascade); | |||
b.HasOne("eShopWeb.Models.CatalogType", "CatalogType") | |||
.WithMany() | |||
.HasForeignKey("CatalogTypeId") | |||
.OnDelete(DeleteBehavior.Cascade); | |||
}); | |||
} | |||
} | |||
} |
@ -1,15 +0,0 @@ | |||
namespace Microsoft.eShopWeb.Models | |||
{ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
public class CatalogBrand | |||
{ | |||
public int Id { get; set; } | |||
public string Brand { get; set; } | |||
} | |||
} |
@ -1,27 +0,0 @@ | |||
using System; | |||
namespace Microsoft.eShopWeb.Models | |||
{ | |||
public class CatalogItem | |||
{ | |||
public int Id { get; set; } | |||
public string Name { get; set; } | |||
public string Description { get; set; } | |||
public decimal Price { get; set; } | |||
public string PictureUri { get; set; } | |||
public int CatalogTypeId { get; set; } | |||
public CatalogType CatalogType { get; set; } | |||
public int CatalogBrandId { get; set; } | |||
public CatalogBrand CatalogBrand { get; set; } | |||
public CatalogItem() { } | |||
} | |||
} |
@ -1,14 +0,0 @@ | |||
namespace Microsoft.eShopWeb.Models | |||
{ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
public class CatalogType | |||
{ | |||
public int Id { get; set; } | |||
public string Type { get; set; } | |||
} | |||
} |
@ -1,26 +0,0 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.IO; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
using Microsoft.AspNetCore.Hosting; | |||
namespace Microsoft.eShopWeb | |||
{ | |||
public class Program | |||
{ | |||
public static void Main(string[] args) | |||
{ | |||
var host = new WebHostBuilder() | |||
.UseKestrel() | |||
.UseUrls("http://0.0.0.0:5106") | |||
.UseContentRoot(Directory.GetCurrentDirectory()) | |||
.UseIISIntegration() | |||
.UseStartup<Startup>() | |||
.UseApplicationInsights() | |||
.Build(); | |||
host.Run(); | |||
} | |||
} | |||
} |
@ -1,27 +0,0 @@ | |||
{ | |||
"iisSettings": { | |||
"windowsAuthentication": false, | |||
"anonymousAuthentication": true, | |||
"iisExpress": { | |||
"applicationUrl": "http://localhost:5106/", | |||
"sslPort": 0 | |||
} | |||
}, | |||
"profiles": { | |||
"IIS Express": { | |||
"commandName": "IISExpress", | |||
"launchBrowser": true, | |||
"environmentVariables": { | |||
"ASPNETCORE_ENVIRONMENT": "Development" | |||
} | |||
}, | |||
"eShopWeb": { | |||
"commandName": "Project", | |||
"launchBrowser": true, | |||
"environmentVariables": { | |||
"ASPNETCORE_ENVIRONMENT": "Development" | |||
}, | |||
"applicationUrl": "http://localhost:58299" | |||
} | |||
} | |||
} |
@ -1,88 +0,0 @@ | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
using Microsoft.eShopWeb.Models; | |||
using Microsoft.AspNetCore.Mvc.Rendering; | |||
using Microsoft.EntityFrameworkCore; | |||
using Microsoft.Extensions.Options; | |||
using Microsoft.eShopWeb.Infrastructure; | |||
using Microsoft.eShopWeb.ViewModels; | |||
namespace Microsoft.eShopWeb.Services | |||
{ | |||
public class CatalogService : ICatalogService | |||
{ | |||
private readonly CatalogContext _context; | |||
private readonly IOptionsSnapshot<CatalogSettings> _settings; | |||
public CatalogService(CatalogContext context, IOptionsSnapshot<CatalogSettings> settings) | |||
{ | |||
_context = context; | |||
_settings = settings; | |||
} | |||
public async Task<Catalog> GetCatalogItems(int pageIndex, int itemsPage, int? brandId, int? typeId) | |||
{ | |||
var root = (IQueryable<CatalogItem>)_context.CatalogItems; | |||
if (typeId.HasValue) | |||
{ | |||
root = root.Where(ci => ci.CatalogTypeId == typeId); | |||
} | |||
if (brandId.HasValue) | |||
{ | |||
root = root.Where(ci => ci.CatalogBrandId == brandId); | |||
} | |||
var totalItems = await root | |||
.LongCountAsync(); | |||
var itemsOnPage = await root | |||
.Skip(itemsPage * pageIndex) | |||
.Take(itemsPage) | |||
.ToListAsync(); | |||
itemsOnPage = ComposePicUri(itemsOnPage); | |||
return new Catalog() { Data = itemsOnPage, PageIndex = pageIndex, Count = (int)totalItems }; | |||
} | |||
public async Task<IEnumerable<SelectListItem>> GetBrands() | |||
{ | |||
var brands = await _context.CatalogBrands.ToListAsync(); | |||
var items = new List<SelectListItem>(); | |||
items.Add(new SelectListItem() { Value = null, Text = "All", Selected = true }); | |||
foreach (CatalogBrand brand in brands) | |||
{ | |||
items.Add(new SelectListItem() { Value = brand.Id.ToString(), Text = brand.Brand }); | |||
} | |||
return items; | |||
} | |||
public async Task<IEnumerable<SelectListItem>> GetTypes() | |||
{ | |||
var types = await _context.CatalogTypes.ToListAsync(); | |||
var items = new List<SelectListItem>(); | |||
items.Add(new SelectListItem() { Value = null, Text = "All", Selected = true }); | |||
foreach (CatalogType type in types) | |||
{ | |||
items.Add(new SelectListItem() { Value = type.Id.ToString(), Text = type.Type }); | |||
} | |||
return items; | |||
} | |||
private List<CatalogItem> ComposePicUri(List<CatalogItem> items) | |||
{ | |||
var baseUri = _settings.Value.CatalogBaseUrl; | |||
items.ForEach(x => | |||
{ | |||
x.PictureUri = x.PictureUri.Replace("http://catalogbaseurltobereplaced", baseUri); | |||
}); | |||
return items; | |||
} | |||
} | |||
} |
@ -1,14 +0,0 @@ | |||
using Microsoft.AspNetCore.Mvc.Rendering; | |||
using Microsoft.eShopWeb.ViewModels; | |||
using System.Collections.Generic; | |||
using System.Threading.Tasks; | |||
namespace Microsoft.eShopWeb.Services | |||
{ | |||
public interface ICatalogService | |||
{ | |||
Task<Catalog> GetCatalogItems(int pageIndex, int itemsPage, int? brandID, int? typeId); | |||
Task<IEnumerable<SelectListItem>> GetBrands(); | |||
Task<IEnumerable<SelectListItem>> GetTypes(); | |||
} | |||
} |
@ -1,83 +0,0 @@ | |||
using Microsoft.eShopWeb.Infrastructure; | |||
using Microsoft.eShopWeb.Services; | |||
using Microsoft.AspNetCore.Builder; | |||
using Microsoft.AspNetCore.Hosting; | |||
using Microsoft.EntityFrameworkCore; | |||
using Microsoft.EntityFrameworkCore.Infrastructure; | |||
using Microsoft.Extensions.Configuration; | |||
using Microsoft.Extensions.DependencyInjection; | |||
using Microsoft.Extensions.Logging; | |||
namespace Microsoft.eShopWeb | |||
{ | |||
public class Startup | |||
{ | |||
public Startup(IHostingEnvironment env) | |||
{ | |||
var builder = new ConfigurationBuilder() | |||
.SetBasePath(env.ContentRootPath) | |||
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) | |||
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) | |||
.AddEnvironmentVariables(); | |||
Configuration = builder.Build(); | |||
} | |||
public IConfigurationRoot Configuration { get; } | |||
// This method gets called by the runtime. Use this method to add services to the container. | |||
public void ConfigureServices(IServiceCollection services) | |||
{ | |||
services.AddDbContext<CatalogContext>(c => | |||
{ | |||
try | |||
{ | |||
var text = Configuration["ConnectionString"]; | |||
c.UseSqlServer(Configuration["ConnectionString"]); | |||
c.ConfigureWarnings(wb => | |||
{ | |||
//By default, in this application, we don't want to have client evaluations | |||
wb.Log(RelationalEventId.QueryClientEvaluationWarning); | |||
}); | |||
} | |||
catch (System.Exception ex ) | |||
{ | |||
var message = ex.Message; | |||
} | |||
}); | |||
services.AddTransient<ICatalogService, CatalogService>(); | |||
services.Configure<CatalogSettings>(Configuration); | |||
services.AddMvc(); | |||
} | |||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. | |||
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) | |||
{ | |||
loggerFactory.AddConsole(Configuration.GetSection("Logging")); | |||
loggerFactory.AddDebug(); | |||
if (env.IsDevelopment()) | |||
{ | |||
app.UseDeveloperExceptionPage(); | |||
app.UseBrowserLink(); | |||
} | |||
else | |||
{ | |||
app.UseExceptionHandler("/Catalog/Error"); | |||
} | |||
app.UseStaticFiles(); | |||
app.UseMvc(routes => | |||
{ | |||
routes.MapRoute( | |||
name: "default", | |||
template: "{controller=Catalog}/{action=Index}/{id?}"); | |||
}); | |||
//Seed Data | |||
CatalogContextSeed.SeedAsync(app, loggerFactory) | |||
.Wait(); | |||
} | |||
} | |||
} |
@ -1,13 +0,0 @@ | |||
using Microsoft.eShopWeb.Models; | |||
using System.Collections.Generic; | |||
namespace Microsoft.eShopWeb.ViewModels | |||
{ | |||
public class Catalog | |||
{ | |||
public int PageIndex { get; set; } | |||
public int PageSize { get; set; } | |||
public int Count { get; set; } | |||
public List<CatalogItem> Data { get; set; } | |||
} | |||
} |
@ -1,16 +0,0 @@ | |||
using Microsoft.eShopWeb.Models; | |||
using Microsoft.AspNetCore.Mvc.Rendering; | |||
using System.Collections.Generic; | |||
namespace Microsoft.eShopWeb.ViewModels | |||
{ | |||
public class CatalogIndex | |||
{ | |||
public IEnumerable<CatalogItem> CatalogItems { get; set; } | |||
public IEnumerable<SelectListItem> Brands { get; set; } | |||
public IEnumerable<SelectListItem> Types { get; set; } | |||
public int? BrandFilterApplied { get; set; } | |||
public int? TypesFilterApplied { get; set; } | |||
public PaginationInfo PaginationInfo { get; set; } | |||
} | |||
} |
@ -1,17 +0,0 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
namespace Microsoft.eShopWeb.ViewModels | |||
{ | |||
public class PaginationInfo | |||
{ | |||
public int TotalItems { get; set; } | |||
public int ItemsPerPage { get; set; } | |||
public int ActualPage { get; set; } | |||
public int TotalPages { get; set; } | |||
public string Previous { get; set; } | |||
public string Next { get; set; } | |||
} | |||
} |
@ -1,48 +0,0 @@ | |||
@{ | |||
ViewData["Title"] = "Catalog"; | |||
@model Microsoft.eShopWeb.ViewModels.CatalogIndex | |||
} | |||
<section class="esh-catalog-hero"> | |||
<div class="container"> | |||
<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"> | |||
<label class="esh-catalog-label" data-title="brand"> | |||
<select asp-for="@Model.BrandFilterApplied" asp-items="@Model.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> | |||
</label> | |||
<input class="esh-catalog-send" type="image" src="images/arrow-right.svg" /> | |||
</form> | |||
</div> | |||
</section> | |||
<div class="container"> | |||
@if (Model.CatalogItems.Any()) | |||
{ | |||
@Html.Partial("_pagination", Model.PaginationInfo) | |||
<div class="esh-catalog-items row"> | |||
@foreach (var catalogItem in Model.CatalogItems) | |||
{ | |||
<div class="esh-catalog-item col-md-4"> | |||
@Html.Partial("_product", catalogItem) | |||
</div> | |||
} | |||
</div> | |||
@Html.Partial("_pagination", Model.PaginationInfo) | |||
} | |||
else | |||
{ | |||
<div class="esh-catalog-items row"> | |||
THERE ARE NO RESULTS THAT MATCH YOUR SEARCH | |||
</div> | |||
} | |||
</div> |
@ -1,32 +0,0 @@ | |||
@model Microsoft.eShopWeb.ViewModels.PaginationInfo | |||
<div class="esh-pager"> | |||
<div class="container"> | |||
<article class="esh-pager-wrapper row"> | |||
<nav> | |||
<a class="esh-pager-item esh-pager-item--navigable @Model.Previous" | |||
id="Previous" | |||
asp-controller="Catalog" | |||
asp-action="Index" | |||
asp-route-page="@(Model.ActualPage -1)" | |||
aria-label="Previous"> | |||
Previous | |||
</a> | |||
<span class="esh-pager-item"> | |||
Showing @Model.ItemsPerPage of @Model.TotalItems products - Page @(Model.ActualPage + 1) - @Model.TotalPages | |||
</span> | |||
<a class="esh-pager-item esh-pager-item--navigable @Model.Next" | |||
id="Next" | |||
asp-controller="Catalog" | |||
asp-action="Index" | |||
asp-route-page="@(Model.ActualPage + 1)" | |||
aria-label="Next"> | |||
Next | |||
</a> | |||
</nav> | |||
</article> | |||
</div> | |||
</div> | |||
@ -1,24 +0,0 @@ | |||
@model Microsoft.eShopWeb.Models.CatalogItem | |||
<form asp-controller="Cart" asp-action="AddToCart"> | |||
<img class="esh-catalog-thumbnail" src="@Model.PictureUri" /> | |||
<input class="esh-catalog-button @((!User.Identity.IsAuthenticated) ? "is-disabled" : "")" type="submit" value="[ ADD TO CART ]" /> | |||
<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" /> | |||
<input type="hidden" asp-for="@Model.Price" name="price" /> | |||
</form> |
@ -1,14 +0,0 @@ | |||
@{ | |||
ViewData["Title"] = "Error"; | |||
} | |||
<h1 class="text-danger">Error.</h1> | |||
<h2 class="text-danger">An error occurred while processing your request.</h2> | |||
<h3>Development Mode</h3> | |||
<p> | |||
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred. | |||
</p> | |||
<p> | |||
<strong>Development environment should not be enabled in deployed applications</strong>, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>, and restarting the application. | |||
</p> |
@ -1,75 +0,0 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<meta charset="utf-8" /> | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||
<title>@ViewData["Title"] - Microsoft.eShopOnContainers.WebMVC</title> | |||
<environment names="Development"> | |||
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" /> | |||
<link rel="stylesheet" href="~/css/app.css" /> | |||
<link rel="stylesheet" href="~/css/catalog/pager.css" /> | |||
<link rel="stylesheet" href="~/css/catalog/catalog.component.css" /> | |||
</environment> | |||
<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" | |||
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" /> | |||
<link rel="stylesheet" href="~/css/app.min.css" asp-append-version="true" /> | |||
</environment> | |||
</head> | |||
<body> | |||
<header class="navbar navbar-light navbar-static-top"> | |||
<div class="container"> | |||
<article class="row"> | |||
<section class="col-lg-7 col-md-6 col-xs-12"> | |||
<a class="navbar-brand" routerLink="catalog"> | |||
<a asp-area="" asp-controller="Catalog" asp-action="Index"> | |||
<img src="../images/brand.png" /> | |||
</a> | |||
</section> | |||
</article> | |||
</div> | |||
</header> | |||
@RenderBody() | |||
<footer class="esh-app-footer"> | |||
<div class="container"> | |||
<article class="row"> | |||
<section class="col-sm-6"> | |||
<img class="esh-app-footer-brand" src="../images/brand_dark.png" /> | |||
</section> | |||
<section class="col-sm-6"> | |||
<div class="esh-app-footer-text hidden-xs"> e-ShoponContainers. All right reserved </div> | |||
</section> | |||
</article> | |||
</div> | |||
</footer> | |||
<environment names="Development"> | |||
<script src="~/lib/jquery/dist/jquery.js"></script> | |||
<script src="~/lib/bootstrap/dist/js/bootstrap.js"></script> | |||
<script src="~/js/site.js" asp-append-version="true"></script> | |||
</environment> | |||
<environment names="Staging,Production"> | |||
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js" | |||
asp-fallback-src="~/lib/jquery/dist/jquery.min.js" | |||
asp-fallback-test="window.jQuery"> | |||
</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> | |||
</html> |
@ -1,18 +0,0 @@ | |||
<environment names="Development"> | |||
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script> | |||
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script> | |||
</environment> | |||
<environment names="Staging,Production"> | |||
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.min.js" | |||
asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js" | |||
asp-fallback-test="window.jQuery && window.jQuery.validator" | |||
crossorigin="anonymous" | |||
integrity="sha384-Fnqn3nxp3506LP/7Y3j/25BlWeA3PXTyT1l78LjECcPaKCV12TsZP7yyMxOe/G/k"> | |||
</script> | |||
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js" | |||
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js" | |||
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive" | |||
crossorigin="anonymous" | |||
integrity="sha384-JrXK+k53HACyavUKOsL+NkmSesD2P+73eDMrbTtTk0h4RmOF8hF8apPlkp26JlyH"> | |||
</script> | |||
</environment> |
@ -1,2 +0,0 @@ | |||
@using Microsoft.eShopWeb | |||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers |
@ -1,3 +0,0 @@ | |||
@{ | |||
Layout = "_Layout"; | |||
} |
@ -1,10 +0,0 @@ | |||
{ | |||
"Logging": { | |||
"IncludeScopes": false, | |||
"LogLevel": { | |||
"Default": "Debug", | |||
"System": "Information", | |||
"Microsoft": "Information" | |||
} | |||
} | |||
} |
@ -1,10 +0,0 @@ | |||
{ | |||
"ConnectionString": "Server=tcp:127.0.0.1,5433;Initial Catalog=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word", | |||
"CatalogBaseUrl": "http://localhost:5106", | |||
"Logging": { | |||
"IncludeScopes": false, | |||
"LogLevel": { | |||
"Default": "Warning" | |||
} | |||
} | |||
} |
@ -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/site.min.css", | |||
// An array of relative input file paths. Globbing patterns supported | |||
"inputFiles": [ | |||
"wwwroot/css/site.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,37 +0,0 @@ | |||
<Project Sdk="Microsoft.NET.Sdk.Web"> | |||
<PropertyGroup> | |||
<TargetFramework>netcoreapp1.1</TargetFramework> | |||
</PropertyGroup> | |||
<PropertyGroup> | |||
<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback> | |||
<RuntimeFrameworkVersion>1.1.0</RuntimeFrameworkVersion> | |||
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" /> | |||
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.0" /> | |||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.0" /> | |||
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.0" /> | |||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="1.1.0" /> | |||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="1.1.0" /> | |||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.0" /> | |||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.0" /> | |||
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0-msbuild3-final" /> | |||
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0-msbuild3-final" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Folder Include="Models\" /> | |||
<Folder Include="Pics\" /> | |||
<Folder Include="Views\Catalog\" /> | |||
<Folder Include="wwwroot\css\catalog\" /> | |||
<Folder Include="wwwroot\fonts\" /> | |||
</ItemGroup> | |||
</Project> |
@ -1,86 +0,0 @@ | |||
@font-face { | |||
font-family: Montserrat; | |||
font-weight: 400; | |||
src: url(".../fonts/Montserrat-Regular.eot?") format("eot"), url("../fonts/Montserrat-Regular.woff") format("woff"), url("../fonts/Montserrat-Regular.ttf") format("truetype"), url("../fonts/Montserrat-Regular.svg#Montserrat") format("svg"); | |||
} | |||
@font-face { | |||
font-family: Montserrat; | |||
font-weight: 700; | |||
src: url("../fonts/Montserrat-Bold.eot?") format("eot"), url("../fonts/Montserrat-Bold.woff") format("woff"), url("../fonts/Montserrat-Bold.ttf") format("truetype"), url("../fonts/Montserrat-Bold.svg#Montserrat") format("svg"); | |||
} | |||
html, | |||
body { | |||
font-family: Montserrat, sans-serif; | |||
font-size: 16px; | |||
font-weight: 400; | |||
z-index: 10; | |||
} | |||
*, | |||
*::after, | |||
*::before { | |||
box-sizing: border-box; | |||
} | |||
.preloading { | |||
color: #00A69C; | |||
display: block; | |||
font-size: 1.5rem; | |||
left: 50%; | |||
position: fixed; | |||
top: 50%; | |||
transform: translate(-50%, -50%); | |||
} | |||
select::-ms-expand { | |||
display: none; | |||
} | |||
@media screen and (min-width: 992px) { | |||
.form-input { | |||
max-width: 360px; | |||
width: 360px; | |||
} | |||
} | |||
.form-input { | |||
border-radius: 0; | |||
height: 45px; | |||
padding: 10px; | |||
} | |||
.form-input-small { | |||
max-width: 100px !important; | |||
} | |||
.form-input-medium { | |||
width: 150px !important; | |||
} | |||
.alert { | |||
padding-left: 0; | |||
} | |||
.alert-danger { | |||
background-color: transparent; | |||
border: 0; | |||
color: #FB0D0D; | |||
font-size: 12px; | |||
} | |||
a, | |||
a:active, | |||
a:hover, | |||
a:visited { | |||
color: #000; | |||
text-decoration: none; | |||
transition: color 0.35s; | |||
} | |||
a:hover, | |||
a:active { | |||
color: #75B918; | |||
transition: color 0.35s; | |||
} |
@ -1,147 +0,0 @@ | |||
.esh-catalog-hero { | |||
background-image: url("../../images/main_banner.png"); | |||
background-size: cover; | |||
height: 260px; | |||
width: 100%; | |||
} | |||
.esh-catalog-title { | |||
position: relative; | |||
top: 74.28571px; | |||
} | |||
.esh-catalog-filters { | |||
background-color: #00A69C; | |||
height: 65px; | |||
} | |||
.esh-catalog-filter { | |||
background-color: transparent; | |||
border-color: #00d9cc; | |||
color: #FFFFFF; | |||
cursor: pointer; | |||
margin-right: 1rem; | |||
margin-top: .5rem; | |||
outline-color: #83D01B; | |||
padding-bottom: 0; | |||
padding-left: 0.5rem; | |||
padding-right: 0.5rem; | |||
padding-top: 1.5rem; | |||
min-width: 140px; | |||
-webkit-appearance: none; | |||
} | |||
.esh-catalog-filter option { | |||
background-color: #00A69C; | |||
} | |||
.esh-catalog-label { | |||
display: inline-block; | |||
position: relative; | |||
z-index: 0; | |||
} | |||
.esh-catalog-label::before { | |||
color: rgba(255, 255, 255, 0.5); | |||
content: attr(data-title); | |||
font-size: 0.65rem; | |||
margin-top: 0.65rem; | |||
margin-left: 0.5rem; | |||
position: absolute; | |||
text-transform: uppercase; | |||
z-index: 1; | |||
} | |||
.esh-catalog-label::after { | |||
background-image: url("../../images/arrow-down.png"); | |||
height: 7px; | |||
content: ''; | |||
position: absolute; | |||
right: 1.5rem; | |||
top: 2.5rem; | |||
width: 10px; | |||
z-index: 1; | |||
} | |||
.esh-catalog-send { | |||
background-color: #83D01B; | |||
color: #FFFFFF; | |||
cursor: pointer; | |||
font-size: 1rem; | |||
transform: translateY(.5rem); | |||
padding: 0.5rem; | |||
transition: all 0.35s; | |||
} | |||
.esh-catalog-send:hover { | |||
background-color: #4a760f; | |||
transition: all 0.35s; | |||
} | |||
.esh-catalog-items { | |||
margin-top: 1rem; | |||
} | |||
.esh-catalog-item { | |||
text-align: center; | |||
margin-bottom: 1.5rem; | |||
width: 33%; | |||
display: inline-block; | |||
float: none !important; | |||
} | |||
@media screen and (max-width: 1024px) { | |||
.esh-catalog-item { | |||
width: 50%; | |||
} | |||
} | |||
@media screen and (max-width: 768px) { | |||
.esh-catalog-item { | |||
width: 100%; | |||
} | |||
} | |||
.esh-catalog-thumbnail { | |||
max-width: 370px; | |||
width: 100%; | |||
} | |||
.esh-catalog-button { | |||
background-color: #83D01B; | |||
border: none; | |||
color: #FFFFFF; | |||
cursor: pointer; | |||
font-size: 1rem; | |||
height: 3rem; | |||
margin-top: 1rem; | |||
transition: all 0.35s; | |||
width: 80%; | |||
} | |||
.esh-catalog-button.is-disabled { | |||
opacity: .5; | |||
pointer-events: none; | |||
} | |||
.esh-catalog-button:hover { | |||
background-color: #4a760f; | |||
transition: all 0.35s; | |||
} | |||
.esh-catalog-name { | |||
font-size: 1rem; | |||
font-weight: 300; | |||
margin-top: .5rem; | |||
text-align: center; | |||
text-transform: uppercase; | |||
} | |||
.esh-catalog-price { | |||
text-align: center; | |||
font-weight: 900; | |||
font-size: 28px; | |||
} | |||
.esh-catalog-price::before { | |||
content: '$'; | |||
} |
@ -1,34 +0,0 @@ | |||
.esh-pager-wrapper { | |||
padding-top: 1rem; | |||
text-align: center; | |||
} | |||
.esh-pager-item { | |||
margin: 0 5vw; | |||
} | |||
.esh-pager-item--navigable { | |||
display: inline-block; | |||
cursor: pointer; | |||
} | |||
.esh-pager-item--navigable.is-disabled { | |||
opacity: 0; | |||
pointer-events: none; | |||
} | |||
.esh-pager-item--navigable:hover { | |||
color: #83D01B; | |||
} | |||
@media screen and (max-width: 1280px) { | |||
.esh-pager-item { | |||
font-size: 0.85rem; | |||
} | |||
} | |||
@media screen and (max-width: 1024px) { | |||
.esh-pager-item { | |||
margin: 0 4vw; | |||
} | |||
} |