commit
3dd456bb9c
@ -8,7 +8,7 @@ using System.Net;
|
||||
|
||||
namespace Basket.API.Infrastructure.Filters
|
||||
{
|
||||
public class HttpGlobalExceptionFilter : IExceptionFilter
|
||||
public partial class HttpGlobalExceptionFilter : IExceptionFilter
|
||||
{
|
||||
private readonly IHostingEnvironment env;
|
||||
private readonly ILogger<HttpGlobalExceptionFilter> logger;
|
||||
@ -52,12 +52,5 @@ namespace Basket.API.Infrastructure.Filters
|
||||
}
|
||||
context.ExceptionHandled = true;
|
||||
}
|
||||
|
||||
private class JsonErrorResponse
|
||||
{
|
||||
public string[] Messages { get; set; }
|
||||
|
||||
public object DeveloperMessage { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,9 @@
|
||||
namespace Basket.API.Infrastructure.Filters
|
||||
{
|
||||
public class JsonErrorResponse
|
||||
{
|
||||
public string[] Messages { get; set; }
|
||||
|
||||
public object DeveloperMessage { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
using System.Linq;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
|
||||
namespace Basket.API.Infrastructure.Filters
|
||||
{
|
||||
public class ValidateModelStateFilter : ActionFilterAttribute
|
||||
{
|
||||
public override void OnActionExecuting(ActionExecutingContext context)
|
||||
{
|
||||
if (context.ModelState.IsValid)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var validationErrors = context.ModelState
|
||||
.Keys
|
||||
.SelectMany(k => context.ModelState[k].Errors)
|
||||
.Select(e => e.ErrorMessage)
|
||||
.ToArray();
|
||||
|
||||
var json = new JsonErrorResponse
|
||||
{
|
||||
Messages = validationErrors
|
||||
};
|
||||
|
||||
context.Result = new BadRequestObjectResult(json);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,9 @@
|
||||
namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
|
||||
{
|
||||
public class BasketItem
|
||||
public class BasketItem : IValidatableObject
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string ProductId { get; set; }
|
||||
@ -9,5 +12,16 @@
|
||||
public decimal OldUnitPrice { get; set; }
|
||||
public int Quantity { get; set; }
|
||||
public string PictureUrl { get; set; }
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||
{
|
||||
var results = new List<ValidationResult>();
|
||||
|
||||
if (Quantity < 1)
|
||||
{
|
||||
results.Add(new ValidationResult("Invalid number of units", new []{ "Quantity" }));
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -54,6 +54,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API
|
||||
services.AddMvc(options =>
|
||||
{
|
||||
options.Filters.Add(typeof(HttpGlobalExceptionFilter));
|
||||
options.Filters.Add(typeof(ValidateModelStateFilter));
|
||||
}).AddControllersAsServices();
|
||||
|
||||
services.AddHealthChecks(checks =>
|
||||
|
@ -1,7 +1,13 @@
|
||||
<div class="esh-basket">
|
||||
<esh-header url="/catalog">Back to catalog</esh-header>
|
||||
|
||||
|
||||
<div class="container">
|
||||
<div *ngFor="let errorMessage of errorMessages">
|
||||
<div class="esh-basket-items-margin-left1 row">
|
||||
<div class="alert alert-warning" role="alert"> {{errorMessage}}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<article class="esh-basket-titles row">
|
||||
<section class="esh-basket-title col-xs-3">Product</section>
|
||||
<section class="esh-basket-title col-xs-3 hidden-lg-down"></section>
|
||||
@ -14,7 +20,7 @@
|
||||
<article class="esh-basket-items row">
|
||||
|
||||
<section class="esh-basket-item esh-basket-item--middle col-lg-3 hidden-lg-down">
|
||||
<img class="esh-basket-image" src="{{item.pictureUrl}}" />
|
||||
<img class="esh-basket-image" src="{{item.pictureUrl}}"/>
|
||||
</section>
|
||||
<section class="esh-basket-item esh-basket-item--middle col-xs-3">{{item.productName}}</section>
|
||||
<section class="esh-basket-item esh-basket-item--middle col-xs-2">$ {{item.unitPrice | number:'.2-2'}}</section>
|
||||
@ -23,7 +29,7 @@
|
||||
type="number"
|
||||
min="1"
|
||||
[(ngModel)]="item.quantity"
|
||||
(change)="itemQuantityChanged(item)" />
|
||||
(change)="itemQuantityChanged(item)"/>
|
||||
</section>
|
||||
<section class="esh-basket-item esh-basket-item--middle esh-basket-item--mark col-xs-2">$ {{(item.unitPrice * item.quantity) | number:'.2-2'}}</section>
|
||||
</article>
|
||||
|
@ -1,6 +1,10 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
import 'rxjs/Rx';
|
||||
import { Observable } from 'rxjs/Observable';
|
||||
import 'rxjs/add/observable/throw';
|
||||
|
||||
import { BasketService } from './basket.service';
|
||||
import { IBasket } from '../shared/models/basket.model';
|
||||
import { IBasketItem } from '../shared/models/basketItem.model';
|
||||
@ -12,6 +16,7 @@ import { BasketWrapperService } from '../shared/services/basket.wrapper.service'
|
||||
templateUrl: './basket.component.html'
|
||||
})
|
||||
export class BasketComponent implements OnInit {
|
||||
errorMessages: any;
|
||||
basket: IBasket;
|
||||
totalPrice: number = 0;
|
||||
|
||||
@ -30,7 +35,10 @@ export class BasketComponent implements OnInit {
|
||||
}
|
||||
|
||||
update(event: any) {
|
||||
this.service.setBasket(this.basket).subscribe(x => console.log('basket updated: ' + x));
|
||||
this.service.setBasket(this.basket).catch((errMessage) => {
|
||||
this.errorMessages = errMessage.messages;
|
||||
return Observable.throw(errMessage);
|
||||
}).subscribe(x => console.log('basket updated: ' + x));
|
||||
}
|
||||
|
||||
checkOut(event: any) {
|
||||
|
@ -20,7 +20,7 @@ export class OrdersComponent implements OnInit {
|
||||
|
||||
ngOnInit() {
|
||||
if (this.configurationService.isReady) {
|
||||
this.getOrders()
|
||||
this.getOrders();
|
||||
} else {
|
||||
this.configurationService.settingsLoaded$.subscribe(x => {
|
||||
this.getOrders();
|
||||
@ -31,7 +31,7 @@ export class OrdersComponent implements OnInit {
|
||||
this.interval = setTimeout(() => {
|
||||
this.service.getOrders().subscribe(orders => {
|
||||
this.orders = orders;
|
||||
if (this.orders.length != this.oldOrders.length) {
|
||||
if (this.orders.length !== this.oldOrders.length) {
|
||||
clearInterval(this.interval);
|
||||
}
|
||||
});
|
||||
|
@ -102,7 +102,7 @@ export class DataService {
|
||||
if (error instanceof Response) {
|
||||
let errMessage = '';
|
||||
try {
|
||||
errMessage = error.json().error;
|
||||
errMessage = error.json();
|
||||
} catch (err) {
|
||||
errMessage = error.statusText;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user