Continued Validation Checking

This commit is contained in:
Charles Showalter 2022-05-20 11:09:24 -07:00
parent 9bc0fc3848
commit 762066f13d
8 changed files with 94 additions and 4 deletions

View File

@ -81,6 +81,11 @@ namespace API.Controllers
[HttpPost("register")] [HttpPost("register")]
public async Task<ActionResult<UserDto>> Register(RegisterDto registerDto) public async Task<ActionResult<UserDto>> Register(RegisterDto registerDto)
{ {
if(CheckEmailExistsAsync(registerDto.Email).Result.Value)
{
return new BadRequestObjectResult(new ApiValidationErrorResponse{Errors = new []{"Email address is in use"}});
}
var user = new AppUser var user = new AppUser
{ {
DisplayName = registerDto.DisplayName, DisplayName = registerDto.DisplayName,

View File

@ -1,3 +1,5 @@
using API.Dtos;
using AutoMapper;
using Core.Entities; using Core.Entities;
using Core.Interfaces; using Core.Interfaces;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -7,8 +9,10 @@ namespace API.Controllers
public class BasketController : BaseApiController public class BasketController : BaseApiController
{ {
private readonly IBasketRepository _basketRepository; private readonly IBasketRepository _basketRepository;
public BasketController(IBasketRepository basketRepository) private readonly IMapper _mapper;
public BasketController(IBasketRepository basketRepository, IMapper mapper)
{ {
_mapper = mapper;
_basketRepository = basketRepository; _basketRepository = basketRepository;
} }
@ -20,9 +24,10 @@ namespace API.Controllers
} }
[HttpPost] [HttpPost]
public async Task<ActionResult<CustomerBasket>> UpdateBasket(CustomerBasket basket) public async Task<ActionResult<CustomerBasket>> UpdateBasket(CustomerBasketDto basket)
{ {
var updatedBasket = await _basketRepository.UpdateBasketAsync(basket); var customerBasket = _mapper.Map<CustomerBasketDto, CustomerBasket>(basket);
var updatedBasket = await _basketRepository.UpdateBasketAsync(customerBasket);
return Ok(updatedBasket); return Ok(updatedBasket);
} }

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -7,11 +8,22 @@ namespace API.Dtos
{ {
public class AddressDto public class AddressDto
{ {
[Required]
public string FirstName { get; set; } public string FirstName { get; set; }
[Required]
public string LastName { get; set; } public string LastName { get; set; }
[Required]
public string Street { get; set; } public string Street { get; set; }
[Required]
public string City { get; set; } public string City { get; set; }
[Required]
public string State { get; set; } public string State { get; set; }
[Required]
public string ZipCode { get; set; } public string ZipCode { get; set; }
} }
} }

30
API/Dtos/BasketItemDto.cs Normal file
View File

@ -0,0 +1,30 @@
using System.ComponentModel.DataAnnotations;
namespace API.Dtos
{
public class BasketItemDto
{
[Required]
public int Id { get; set; }
[Required]
public string productName { get; set; }
[Required]
[Range(0.1, double.MaxValue, ErrorMessage = "Price must be greather than 0")]
public decimal Price { get; set; }
[Required]
[Range(1, double.MaxValue, ErrorMessage = "Quantity must be at least 1")]
public int Quantity { get; set; }
[Required]
public string PictureUrl { get; set; }
[Required]
public string Brand { get; set; }
[Required]
public string Type { get; set; }
}
}

View File

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace API.Dtos
{
public class CustomerBasketDto
{
[Required]
public string Id { get; set; }
public List<BasketItemDto> Items { get; set; }
}
}

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -7,8 +8,15 @@ namespace API.Dtos
{ {
public class RegisterDto public class RegisterDto
{ {
[Required]
public string DisplayName { get; set; } public string DisplayName { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; } public string Email { get; set; }
[Required]
[RegularExpression("(?=^.{6,10}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&amp;*()_+}{&quot;:;'?/&gt;.&lt;,])(?!.*\\s).*$", ErrorMessage = "Password does not meet complexity. Password must have 1 Uppercase, 1 Lowercase, 1 Number, 1 Special Character and at least 6 characeters.")]
public string Password { get; set; } public string Password { get; set; }
} }
} }

View File

@ -8,7 +8,24 @@ namespace API.Extensions
{ {
services.AddSwaggerGen(c => services.AddSwaggerGen(c =>
{ {
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebAPIv5", Version = "v1" }); c.SwaggerDoc("v1", new OpenApiInfo { Title = "SkitNet API", Version = "v1" });
var securitySchema = new OpenApiSecurityScheme
{
Description = "JWT Auth Bearer Scheme",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
Scheme = "bearer",
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
};
c.AddSecurityDefinition("Bearer", securitySchema);
var securityRequirements = new OpenApiSecurityRequirement {{securitySchema, new[]{"Bearer"}}};
c.AddSecurityRequirement(securityRequirements);
}); });
return services; return services;

View File

@ -15,6 +15,8 @@ namespace API.Helpers
.ForMember(d => d.PictureUrl, o => o.MapFrom<ProductUrlResolver>()); .ForMember(d => d.PictureUrl, o => o.MapFrom<ProductUrlResolver>());
CreateMap<Address, AddressDto>().ReverseMap(); CreateMap<Address, AddressDto>().ReverseMap();
CreateMap<CustomerBasketDto, CustomerBasket>();
CreateMap<BasketItemDto, BasketItem>();
} }
} }
} }