Skip to content

Commit

Permalink
API - refactoring with save picture on the product / add new method -…
Browse files Browse the repository at this point in the history
… update picture
  • Loading branch information
KrzysztofPajak committed Oct 28, 2021
1 parent 236a5e6 commit c5b649a
Show file tree
Hide file tree
Showing 10 changed files with 96 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,18 @@ public AddProductPictureCommandHandler(

public async Task<bool> Handle(AddProductPictureCommand request, CancellationToken cancellationToken)
{
var product = await _productService.GetProductById(request.Product.Id);
if (product == null)
return false;

var picture = await _pictureService.GetPictureById(request.Model.PictureId);
if (picture != null)
{
await _pictureService.UpdatePicture(picture.Id, await _pictureService.LoadPictureBinary(picture),
picture.MimeType,
picture.SeoFilename,
request.Model.AltAttribute,
request.Model.TitleAttribute);
if (picture == null)
return false;

await _productService.InsertProductPicture(new ProductPicture
{
PictureId = request.Model.PictureId,
DisplayOrder = request.Model.DisplayOrder,
}, request.Product.Id);
await _pictureService.SetSeoFilename(picture, _pictureService.GetPictureSeName(request.Product.Name));
}
await _productService.InsertProductPicture(new ProductPicture {
PictureId = picture.Id,
DisplayOrder = request.Model.DisplayOrder,
}, product.Id);

return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,38 +11,22 @@ namespace Grand.Api.Commands.Models.Catalog
public class UpdateProductPictureCommandHandler : IRequestHandler<UpdateProductPictureCommand, bool>
{
private readonly IProductService _productService;
private readonly IPictureService _pictureService;

public UpdateProductPictureCommandHandler(
IProductService productService,
IPictureService pictureService)
IProductService productService)
{
_productService = productService;
_pictureService = pictureService;
}

public async Task<bool> Handle(UpdateProductPictureCommand request, CancellationToken cancellationToken)
{
var product = await _productService.GetProductById(request.Product.Id, true);

var productPicture = product.ProductPictures.Where(x => x.PictureId == request.Model.PictureId).FirstOrDefault();
if (productPicture == null)
throw new ArgumentException("No product picture found with the specified id");

var picture = await _pictureService.GetPictureById(productPicture.PictureId);
if (picture == null)
throw new ArgumentException("No picture found with the specified id");

productPicture.DisplayOrder = request.Model.DisplayOrder;
await _productService.UpdateProductPicture(productPicture, product.Id);

await _pictureService.UpdatePicture(picture.Id,
await _pictureService.LoadPictureBinary(picture),
picture.MimeType,
request.Model.SeoFilename,
request.Model.AltAttribute,
request.Model.TitleAttribute);

var product = await _productService.GetProductById(request.Product.Id);
var pp = product.ProductPictures.FirstOrDefault(x => x.PictureId == request.Model.PictureId);
if (pp != null)
{
pp.DisplayOrder = request.Model.DisplayOrder;
await _productService.UpdateProductPicture(pp, request.Product.Id);
}
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Grand.Business.Storage.Interfaces;
using MediatR;
using System.Threading;
using System.Threading.Tasks;

namespace Grand.Api.Commands.Models.Catalog
{
public class UpdatePictureCommandHandler : IRequestHandler<UpdatePictureCommand, bool>
{
private readonly IPictureService _pictureService;

public UpdatePictureCommandHandler(
IPictureService pictureService)
{
_pictureService = pictureService;
}

public async Task<bool> Handle(UpdatePictureCommand request, CancellationToken cancellationToken)
{
var picture = await _pictureService.GetPictureById(request.Model.Id);
if (picture == null)
return false;

await _pictureService.UpdatePicture(picture.Id, request.Model.PictureBinary,
request.Model.MimeType, request.Model.SeoFilename, request.Model.AltAttribute, request.Model.TitleAttribute);

return true;
}
}
}
10 changes: 10 additions & 0 deletions src/API/Grand.Api/Commands/Models/Common/UpdatePictureCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Grand.Api.DTOs.Common;
using MediatR;

namespace Grand.Api.Commands.Models.Catalog
{
public class UpdatePictureCommand : IRequest<bool>
{
public PictureDto Model { get; set; }
}
}
25 changes: 24 additions & 1 deletion src/API/Grand.Api/Controllers/OData/PictureController.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
using Grand.Api.Commands.Models.Common;
using Grand.Api.Commands.Models.Catalog;
using Grand.Api.Commands.Models.Common;
using Grand.Api.DTOs.Common;
using Grand.Api.Queries.Models.Common;
using Grand.Business.Common.Interfaces.Security;
using Grand.Business.Common.Services.Security;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
using System.Linq;
using System.Threading.Tasks;

namespace Grand.Api.Controllers.OData
Expand Down Expand Up @@ -50,6 +52,27 @@ public async Task<IActionResult> Post([FromBody] PictureDto model)
return BadRequest(ModelState);
}

[SwaggerOperation(summary: "Update entity in Picture", OperationId = "UpdatePicture")]
[HttpPut]
public async Task<IActionResult> Put([FromBody] PictureDto model)
{
if (!await _permissionService.Authorize(PermissionSystemName.Categories))
return Forbid();

if (ModelState.IsValid)
{
var picture = await _mediator.Send(new GetPictureByIdQuery() { Id = model.Id });
if (picture == null)
{
return NotFound();
}

var result = await _mediator.Send(new UpdatePictureCommand() { Model = model });
return Ok(result);
}
return BadRequest(ModelState);
}

[SwaggerOperation(summary: "Delete entity in Picture", OperationId = "DeletePicture")]
[HttpDelete]
public async Task<IActionResult> Delete(string key)
Expand Down
4 changes: 0 additions & 4 deletions src/API/Grand.Api/DTOs/Catalog/ProductPictureDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,5 @@ public partial class ProductPictureDto
[Key]
public string PictureId { get; set; }
public int DisplayOrder { get; set; }
public string MimeType { get; set; }
public string SeoFilename { get; set; }
public string AltAttribute { get; set; }
public string TitleAttribute { get; set; }
}
}
2 changes: 1 addition & 1 deletion src/API/Grand.Api/Extensions/MappingExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ public static PictureDto ToModel(this Picture entity)
{
return entity.MapTo<Picture, PictureDto>();
}

#endregion
}
}
8 changes: 0 additions & 8 deletions src/API/Grand.Api/Infrastructure/DependencyEdmModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,20 +118,12 @@ protected void RegisterProduct(ODataConventionModelBuilder builder)
#region Product picture
ActionConfiguration createPicture = product.Action("CreateProductPicture");
createPicture.Parameter<string>(nameof(ProductPictureDto.PictureId)).Required();
createPicture.Parameter<string>(nameof(ProductPictureDto.MimeType)).Required();
createPicture.Parameter<string>(nameof(ProductPictureDto.SeoFilename)).Required();
createPicture.Parameter<string>(nameof(ProductPictureDto.AltAttribute)).Required();
createPicture.Parameter<int>(nameof(ProductPictureDto.DisplayOrder)).Required();
createPicture.Parameter<string>(nameof(ProductPictureDto.TitleAttribute)).Required();
createPicture.Returns<bool>();

ActionConfiguration updatePicture = product.Action("UpdateProductPicture");
updatePicture.Parameter<string>(nameof(ProductPictureDto.PictureId)).Required();
updatePicture.Parameter<string>(nameof(ProductPictureDto.MimeType)).Required();
updatePicture.Parameter<string>(nameof(ProductPictureDto.SeoFilename)).Required();
updatePicture.Parameter<string>(nameof(ProductPictureDto.AltAttribute)).Required();
updatePicture.Parameter<int>(nameof(ProductPictureDto.DisplayOrder)).Required();
updatePicture.Parameter<string>(nameof(ProductPictureDto.TitleAttribute)).Required();
updatePicture.Returns<bool>();

ActionConfiguration deletePicture = product.Action("DeleteProductPicture");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public PictureProfile()

CreateMap<Picture, PictureDto>()
.ForMember(dest => dest.PictureBinary, mo => mo.Ignore());

}

public int Order => 1;
Expand Down
14 changes: 12 additions & 2 deletions src/API/Grand.Api/Validators/Common/PictureValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,19 @@ public PictureValidator(
ITranslationService translationService)
: base(validators)
{
RuleFor(x => x.PictureBinary).NotEmpty().WithMessage(translationService.GetResource("Api.Common.Picture.Fields.PictureBinary.Required"));
RuleFor(x => x.MimeType).NotEmpty().WithMessage(translationService.GetResource("Api.Common.Picture.Fields.MimeType.Required"));
RuleFor(x => x.Id).Empty().WithMessage(translationService.GetResource("Api.Common.Picture.Fields.Id.NotRequired"));
RuleFor(x => x.PictureBinary).Must((x, context) =>
{
if (!string.IsNullOrEmpty(x.Id) && (x.PictureBinary==null || x.PictureBinary.Length == 0))
{
return true;
}
if (string.IsNullOrEmpty(x.Id) && (x.PictureBinary == null || x.PictureBinary.Length == 0))
{
return false;
}
return true;
}).WithMessage(translationService.GetResource("Api.Common.Picture.Fields.PictureBinary.Required"));
}
}
}

0 comments on commit c5b649a

Please sign in to comment.