diff --git a/API/Controllers/AccountController.cs b/API/Controllers/AccountController.cs index 1abe895..61e5889 100644 --- a/API/Controllers/AccountController.cs +++ b/API/Controllers/AccountController.cs @@ -81,6 +81,11 @@ namespace API.Controllers [HttpPost("register")] public async Task> 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 { DisplayName = registerDto.DisplayName, diff --git a/API/Controllers/BasketController.cs b/API/Controllers/BasketController.cs index afe1d51..a3e47a4 100644 --- a/API/Controllers/BasketController.cs +++ b/API/Controllers/BasketController.cs @@ -1,3 +1,5 @@ +using API.Dtos; +using AutoMapper; using Core.Entities; using Core.Interfaces; using Microsoft.AspNetCore.Mvc; @@ -7,8 +9,10 @@ namespace API.Controllers public class BasketController : BaseApiController { private readonly IBasketRepository _basketRepository; - public BasketController(IBasketRepository basketRepository) + private readonly IMapper _mapper; + public BasketController(IBasketRepository basketRepository, IMapper mapper) { + _mapper = mapper; _basketRepository = basketRepository; } @@ -20,9 +24,10 @@ namespace API.Controllers } [HttpPost] - public async Task> UpdateBasket(CustomerBasket basket) + public async Task> UpdateBasket(CustomerBasketDto basket) { - var updatedBasket = await _basketRepository.UpdateBasketAsync(basket); + var customerBasket = _mapper.Map(basket); + var updatedBasket = await _basketRepository.UpdateBasketAsync(customerBasket); return Ok(updatedBasket); } diff --git a/API/Dtos/AddressDto.cs b/API/Dtos/AddressDto.cs index 27ee4de..bc6ed2c 100644 --- a/API/Dtos/AddressDto.cs +++ b/API/Dtos/AddressDto.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; @@ -7,11 +8,22 @@ namespace API.Dtos { public class AddressDto { + [Required] public string FirstName { get; set; } + + [Required] public string LastName { get; set; } + + [Required] public string Street { get; set; } + + [Required] public string City { get; set; } + + [Required] public string State { get; set; } + + [Required] public string ZipCode { get; set; } } } \ No newline at end of file diff --git a/API/Dtos/BasketItemDto.cs b/API/Dtos/BasketItemDto.cs new file mode 100644 index 0000000..b0de397 --- /dev/null +++ b/API/Dtos/BasketItemDto.cs @@ -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; } + } +} \ No newline at end of file diff --git a/API/Dtos/CustomerBasketDto.cs b/API/Dtos/CustomerBasketDto.cs new file mode 100644 index 0000000..9df57c9 --- /dev/null +++ b/API/Dtos/CustomerBasketDto.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace API.Dtos +{ + public class CustomerBasketDto + { + [Required] + public string Id { get; set; } + public List Items { get; set; } + } +} \ No newline at end of file diff --git a/API/Dtos/RegisterDto.cs b/API/Dtos/RegisterDto.cs index 43684ff..87a1029 100644 --- a/API/Dtos/RegisterDto.cs +++ b/API/Dtos/RegisterDto.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; @@ -7,8 +8,15 @@ namespace API.Dtos { public class RegisterDto { + [Required] public string DisplayName { get; set; } + + [Required] + [EmailAddress] public string Email { get; set; } + + [Required] + [RegularExpression("(?=^.{6,10}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;'?/>.<,])(?!.*\\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; } } } \ No newline at end of file diff --git a/API/Extensions/SwaggerServiceExtensions.cs b/API/Extensions/SwaggerServiceExtensions.cs index 1d8d41c..9bc000c 100644 --- a/API/Extensions/SwaggerServiceExtensions.cs +++ b/API/Extensions/SwaggerServiceExtensions.cs @@ -8,7 +8,24 @@ namespace API.Extensions { 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; diff --git a/API/Helpers/MappingProfiles.cs b/API/Helpers/MappingProfiles.cs index 54ccad1..7eddbd5 100644 --- a/API/Helpers/MappingProfiles.cs +++ b/API/Helpers/MappingProfiles.cs @@ -15,6 +15,8 @@ namespace API.Helpers .ForMember(d => d.PictureUrl, o => o.MapFrom()); CreateMap().ReverseMap(); + CreateMap(); + CreateMap(); } } } \ No newline at end of file