Fix issue #259
This commit is contained in:
parent
3d552b3219
commit
737bddadc2
@ -8,7 +8,7 @@ using System.Net;
|
|||||||
|
|
||||||
namespace Basket.API.Infrastructure.Filters
|
namespace Basket.API.Infrastructure.Filters
|
||||||
{
|
{
|
||||||
public class HttpGlobalExceptionFilter : IExceptionFilter
|
public partial class HttpGlobalExceptionFilter : IExceptionFilter
|
||||||
{
|
{
|
||||||
private readonly IHostingEnvironment env;
|
private readonly IHostingEnvironment env;
|
||||||
private readonly ILogger<HttpGlobalExceptionFilter> logger;
|
private readonly ILogger<HttpGlobalExceptionFilter> logger;
|
||||||
@ -52,12 +52,5 @@ namespace Basket.API.Infrastructure.Filters
|
|||||||
}
|
}
|
||||||
context.ExceptionHandled = true;
|
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 Id { get; set; }
|
||||||
public string ProductId { get; set; }
|
public string ProductId { get; set; }
|
||||||
@ -9,5 +12,16 @@
|
|||||||
public decimal OldUnitPrice { get; set; }
|
public decimal OldUnitPrice { get; set; }
|
||||||
public int Quantity { get; set; }
|
public int Quantity { get; set; }
|
||||||
public string PictureUrl { 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 =>
|
services.AddMvc(options =>
|
||||||
{
|
{
|
||||||
options.Filters.Add(typeof(HttpGlobalExceptionFilter));
|
options.Filters.Add(typeof(HttpGlobalExceptionFilter));
|
||||||
|
options.Filters.Add(typeof(ValidateModelStateFilter));
|
||||||
}).AddControllersAsServices();
|
}).AddControllersAsServices();
|
||||||
|
|
||||||
services.AddHealthChecks(checks =>
|
services.AddHealthChecks(checks =>
|
||||||
|
@ -1,7 +1,13 @@
|
|||||||
<div class="esh-basket">
|
<div class="esh-basket">
|
||||||
<esh-header url="/catalog">Back to catalog</esh-header>
|
<esh-header url="/catalog">Back to catalog</esh-header>
|
||||||
|
|
||||||
<div class="container">
|
<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">
|
<article class="esh-basket-titles row">
|
||||||
<section class="esh-basket-title col-xs-3">Product</section>
|
<section class="esh-basket-title col-xs-3">Product</section>
|
||||||
<section class="esh-basket-title col-xs-3 hidden-lg-down"></section>
|
<section class="esh-basket-title col-xs-3 hidden-lg-down"></section>
|
||||||
@ -14,7 +20,7 @@
|
|||||||
<article class="esh-basket-items row">
|
<article class="esh-basket-items row">
|
||||||
|
|
||||||
<section class="esh-basket-item esh-basket-item--middle col-lg-3 hidden-lg-down">
|
<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>
|
||||||
<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-3">{{item.productName}}</section>
|
||||||
<section class="esh-basket-item esh-basket-item--middle col-xs-2">$ {{item.unitPrice | number:'.2-2'}}</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"
|
type="number"
|
||||||
min="1"
|
min="1"
|
||||||
[(ngModel)]="item.quantity"
|
[(ngModel)]="item.quantity"
|
||||||
(change)="itemQuantityChanged(item)" />
|
(change)="itemQuantityChanged(item)"/>
|
||||||
</section>
|
</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>
|
<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>
|
</article>
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
|
import 'rxjs/Rx';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
import 'rxjs/add/observable/throw';
|
||||||
|
|
||||||
import { BasketService } from './basket.service';
|
import { BasketService } from './basket.service';
|
||||||
import { IBasket } from '../shared/models/basket.model';
|
import { IBasket } from '../shared/models/basket.model';
|
||||||
import { IBasketItem } from '../shared/models/basketItem.model';
|
import { IBasketItem } from '../shared/models/basketItem.model';
|
||||||
@ -12,6 +16,7 @@ import { BasketWrapperService } from '../shared/services/basket.wrapper.service'
|
|||||||
templateUrl: './basket.component.html'
|
templateUrl: './basket.component.html'
|
||||||
})
|
})
|
||||||
export class BasketComponent implements OnInit {
|
export class BasketComponent implements OnInit {
|
||||||
|
errorMessages: any;
|
||||||
basket: IBasket;
|
basket: IBasket;
|
||||||
totalPrice: number = 0;
|
totalPrice: number = 0;
|
||||||
|
|
||||||
@ -30,7 +35,10 @@ export class BasketComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
update(event: any) {
|
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) {
|
checkOut(event: any) {
|
||||||
|
@ -20,7 +20,7 @@ export class OrdersComponent implements OnInit {
|
|||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
if (this.configurationService.isReady) {
|
if (this.configurationService.isReady) {
|
||||||
this.getOrders()
|
this.getOrders();
|
||||||
} else {
|
} else {
|
||||||
this.configurationService.settingsLoaded$.subscribe(x => {
|
this.configurationService.settingsLoaded$.subscribe(x => {
|
||||||
this.getOrders();
|
this.getOrders();
|
||||||
@ -31,7 +31,7 @@ export class OrdersComponent implements OnInit {
|
|||||||
this.interval = setTimeout(() => {
|
this.interval = setTimeout(() => {
|
||||||
this.service.getOrders().subscribe(orders => {
|
this.service.getOrders().subscribe(orders => {
|
||||||
this.orders = orders;
|
this.orders = orders;
|
||||||
if (this.orders.length != this.oldOrders.length) {
|
if (this.orders.length !== this.oldOrders.length) {
|
||||||
clearInterval(this.interval);
|
clearInterval(this.interval);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -102,7 +102,7 @@ export class DataService {
|
|||||||
if (error instanceof Response) {
|
if (error instanceof Response) {
|
||||||
let errMessage = '';
|
let errMessage = '';
|
||||||
try {
|
try {
|
||||||
errMessage = error.json().error;
|
errMessage = error.json();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
errMessage = error.statusText;
|
errMessage = error.statusText;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user