Browse Source

Fix issue #259

pull/282/head
PLAINCONCEPTS\lruiz 7 years ago
parent
commit
737bddadc2
9 changed files with 78 additions and 17 deletions
  1. +1
    -8
      src/Services/Basket/Basket.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs
  2. +9
    -0
      src/Services/Basket/Basket.API/Infrastructure/Filters/JsonErrorResponse.cs
  3. +30
    -0
      src/Services/Basket/Basket.API/Infrastructure/Filters/ValidateModelStateFilter.cs
  4. +16
    -2
      src/Services/Basket/Basket.API/Model/BasketItem.cs
  5. +1
    -0
      src/Services/Basket/Basket.API/Startup.cs
  6. +9
    -3
      src/Web/WebSPA/Client/modules/basket/basket.component.html
  7. +9
    -1
      src/Web/WebSPA/Client/modules/basket/basket.component.ts
  8. +2
    -2
      src/Web/WebSPA/Client/modules/orders/orders.component.ts
  9. +1
    -1
      src/Web/WebSPA/Client/modules/shared/services/data.service.ts

+ 1
- 8
src/Services/Basket/Basket.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs View File

@ -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; }
}
}
}

+ 9
- 0
src/Services/Basket/Basket.API/Infrastructure/Filters/JsonErrorResponse.cs View File

@ -0,0 +1,9 @@
namespace Basket.API.Infrastructure.Filters
{
public class JsonErrorResponse
{
public string[] Messages { get; set; }
public object DeveloperMessage { get; set; }
}
}

+ 30
- 0
src/Services/Basket/Basket.API/Infrastructure/Filters/ValidateModelStateFilter.cs View File

@ -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);
}
}
}

+ 16
- 2
src/Services/Basket/Basket.API/Model/BasketItem.cs View File

@ -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;
}
}
}

+ 1
- 0
src/Services/Basket/Basket.API/Startup.cs View File

@ -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 =>


+ 9
- 3
src/Web/WebSPA/Client/modules/basket/basket.component.html View File

@ -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">&nbsp;{{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>


+ 9
- 1
src/Web/WebSPA/Client/modules/basket/basket.component.ts View File

@ -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) {


+ 2
- 2
src/Web/WebSPA/Client/modules/orders/orders.component.ts View File

@ -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);
}
});


+ 1
- 1
src/Web/WebSPA/Client/modules/shared/services/data.service.ts View File

@ -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…
Cancel
Save