49 lines
1.8 KiB
C#
49 lines
1.8 KiB
C#
using System.Text.Json;
|
|
using MediatR;
|
|
using Nashel.BuildingBlocks.Application.Abstractions;
|
|
using Nashel.Modules.Catalog.Domain.Aggregates;
|
|
using Nashel.Modules.Catalog.Domain.Repositories;
|
|
using Nashel.Modules.Catalog.Domain.ValueObjects;
|
|
|
|
namespace Nashel.Modules.Catalog.Application.Commands;
|
|
|
|
public record UpdateOfferCommand(
|
|
Guid OfferId,
|
|
string Title,
|
|
string Description,
|
|
decimal PriceAmount,
|
|
int PriceType, // 0-Fixed, 1-Hourly, 2-Negotiable
|
|
Dictionary<string, string>? Attributes,
|
|
List<string>? Images) : IRequest<bool>;
|
|
|
|
public class UpdateOfferCommandHandler : IRequestHandler<UpdateOfferCommand, bool>
|
|
{
|
|
private readonly IOfferRepository _repository;
|
|
private readonly ICurrentUserService _currentUser;
|
|
|
|
public UpdateOfferCommandHandler(IOfferRepository repository, ICurrentUserService currentUser)
|
|
{
|
|
_repository = repository;
|
|
_currentUser = currentUser;
|
|
}
|
|
|
|
public async Task<bool> Handle(UpdateOfferCommand request, CancellationToken cancellationToken)
|
|
{
|
|
var offer = await _repository.GetByIdAsync(request.OfferId, cancellationToken);
|
|
if (offer == null) throw new Exception("Offer not found");
|
|
|
|
if (offer.PerformerId != _currentUser.UserId)
|
|
throw new UnauthorizedAccessException("Not your offer");
|
|
|
|
var price = new Price(request.PriceAmount, (Nashel.Modules.Catalog.Domain.Enums.OfferType)request.PriceType);
|
|
var jsonAttrs = request.Attributes != null && request.Attributes.Count > 0
|
|
? JsonDocument.Parse(JsonSerializer.Serialize(request.Attributes))
|
|
: null;
|
|
|
|
offer.Update(request.Title, request.Description, price, jsonAttrs, request.Images);
|
|
|
|
await _repository.UpdateAsync(offer, cancellationToken);
|
|
return true;
|
|
}
|
|
}
|