Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Streetcode/Streetcode.BLL/DTO/Media/Art/ArtCreateDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Streetcode.BLL.DTO.Media.Images;

namespace Streetcode.BLL.DTO.Media.Art
{
public class ArtCreateDto
{
public string? Description { get; set; }
public string? Title { get; set; }
public int ImageId { get; set; }
}
}
13 changes: 13 additions & 0 deletions Streetcode/Streetcode.BLL/DTO/Media/Art/ArtUpdateDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Streetcode.BLL.DTO.Media.Images;

namespace Streetcode.BLL.DTO.Media.Art
{
public class ArtUpdateDto
{
public int Id { get; set; }
public string? Description { get; set; }
public string? Title { get; set; }
public int ImageId { get; set; }
public ImageDTO? Image { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Streetcode.BLL.DTO.Media.ArtSlides
{
public class ArtSlideItemDto
{
public int ArtId { get; set; }
public int Index { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Streetcode.BLL.DTO.Media.Art;
using Streetcode.DAL.Entities.Media.Images;

namespace Streetcode.BLL.DTO.Media.ArtSlides
{
public class CreateStreetcodeArtSlideDto
{
public int Index { get; set; }
public int TemplateId { get; set; }
public int StreetcodeId { get; set; }

public List<ArtSlideItemDto> ArtSlideItems { get; set; } = new();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Streetcode.DAL.Entities.Media.Images;

namespace Streetcode.BLL.DTO.Media.ArtSlides
{
public class StreetcodeArtSlideDto
{
public int Id { get; set; }
public int Index { get; set; }

public int TemplateId { get; set; }
public StreetcodeArtSlideTemplate Template { get; set; } = null!;

public List<ArtSlideItemDto> ArtSlideItems { get; set; } = new();
public int StreetcodeId { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Streetcode.BLL.DTO.Media.ArtSlides
{
public class StreetcodeArtSlideItemDto
{
public int ArtId { get; set; }
public int Index { get; set; }
}
}
16 changes: 16 additions & 0 deletions Streetcode/Streetcode.BLL/DTO/Media/ArtSlides/UpdateArtSlideDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Streetcode.DAL.Entities.Media.Images;

namespace Streetcode.BLL.DTO.Media.ArtSlides
{
public class UpdateArtSlideDto
{
public int Id { get; set; }
public int Index { get; set; }

public int TemplateId { get; set; }
public StreetcodeArtSlideTemplate Template { get; set; } = null!;

public List<ArtSlideItemDto> ArtSlideItems { get; set; } = new();
public int StreetcodeId { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Streetcode.BLL.DTO.Media.ArtSlidesTemplates
{
public class StreetcodeArtSlideTemplateDto
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
}
}
4 changes: 4 additions & 0 deletions Streetcode/Streetcode.BLL/Mapping/Media/Images/ArtProfile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,9 @@ public class ArtProfile : Profile
public ArtProfile()
{
CreateMap<Art, ArtDTO>().ReverseMap();
CreateMap<ArtCreateDto, DAL.Entities.Media.Images.Art>()
.ForMember(dest => dest.ImageId, opt => opt.MapFrom(src => src.ImageId))
.ForMember(dest => dest.Image, opt => opt.Ignore());
CreateMap<ArtUpdateDto, Art>();
}
}
22 changes: 22 additions & 0 deletions Streetcode/Streetcode.BLL/Mapping/Media/Images/ArtSlideProfile.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using AutoMapper;
using Streetcode.BLL.DTO.Media.ArtSlides;
using Streetcode.DAL.Entities.Media.Images;

namespace Streetcode.BLL.Mapping.Media.Images
{
public class ArtSlideProfile : Profile
{
public ArtSlideProfile()
{
CreateMap<CreateStreetcodeArtSlideDto, StreetcodeArtSlide>()
.ForMember(dest => dest.ArtSlideItems, opt => opt.Ignore())
.ReverseMap();

CreateMap<StreetcodeArtSlide, StreetcodeArtSlideDto>().ReverseMap();

CreateMap<ArtSlideItemDto, ArtSlideItem>().ReverseMap();

CreateMap<StreetcodeArtSlide, StreetcodeArtSlideDto>().ReverseMap();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using AutoMapper;
using Streetcode.BLL.DTO.Media.ArtSlidesTemplates;
using Streetcode.DAL.Entities.Media.Images;

namespace Streetcode.BLL.Mapping.Media.Images
{
internal class ArtSlideTeamplatesProfile : Profile
{
public ArtSlideTeamplatesProfile()
{
CreateMap<StreetcodeArtSlideTemplate, StreetcodeArtSlideTemplateDto>().ReverseMap();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using AutoMapper;
using Streetcode.BLL.DTO.Media.ArtSlides;
using Streetcode.DAL.Entities.Media.Images;

namespace Streetcode.BLL.Mapping.Media
{
public class StreetcodeArtSlideProfile : Profile
{
public StreetcodeArtSlideProfile()
{
CreateMap<StreetcodeArtSlide, StreetcodeArtSlideDto>()
.ForMember(dto => dto.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dto => dto.Template, opt => opt.MapFrom(src => src.TemplateId))
.ReverseMap()
.ForMember(src => src.Id, opt => opt.MapFrom(dto => dto.Id))
.ForMember(src => src.TemplateId, opt => opt.MapFrom(dto => dto.Template));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using FluentResults;
using MediatR;
using Streetcode.BLL.DTO.Media.Art;

namespace Streetcode.BLL.MediatR.Media.Art.Create
{
public record CreateArtCommand(ArtCreateDto ArtDto) : IRequest<Result<ArtDTO>>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using AutoMapper;
using FluentResults;
using MediatR;
using Streetcode.BLL.DTO.Media.Art;
using Streetcode.DAL.Repositories.Interfaces.Base;

namespace Streetcode.BLL.MediatR.Media.Art.Create
{
public class CreateArtHandler : IRequestHandler<CreateArtCommand, Result<ArtDTO>>
{
private readonly IMapper _mapper;
private readonly IRepositoryWrapper _repositoryWrapper;

public CreateArtHandler(IMapper mapper, IRepositoryWrapper repositoryWrapper)
{
_mapper = mapper;
_repositoryWrapper = repositoryWrapper;
}

public async Task<Result<ArtDTO>> Handle(CreateArtCommand request, CancellationToken cancellationToken)
{
var art = _mapper.Map<DAL.Entities.Media.Images.Art>(request.ArtDto);
await _repositoryWrapper.ArtRepository.CreateAsync(art);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);

return Result.Ok(_mapper.Map<ArtDTO>(art));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using FluentResults;
using MediatR;
using Streetcode.BLL.MediatR.Interface;

namespace Streetcode.BLL.MediatR.Media.Art.Delete
{
public record DeleteArtCommand(int Id) : IRequest<Result<Unit>>, IHasId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using FluentResults;
using MediatR;
using Streetcode.BLL.Resources;
using Streetcode.DAL.Repositories.Interfaces.Base;

namespace Streetcode.BLL.MediatR.Media.Art.Delete
{
public class DeleteArtHandler : IRequestHandler<DeleteArtCommand, Result<Unit>>
{
private readonly IRepositoryWrapper _repositoryWrapper;

public DeleteArtHandler(IRepositoryWrapper repositoryWrapper)
{
_repositoryWrapper = repositoryWrapper;
}

public async Task<Result<Unit>> Handle(DeleteArtCommand request, CancellationToken cancellationToken)
{
var art = await _repositoryWrapper.ArtRepository.GetFirstOrDefaultAsync(
predicate: a => a.Id == request.Id,
cancellationToken: cancellationToken
);

if (art == null)
{
return Result.Fail(string.Format(ErrorMessages.EntityNotFound, request.Id));
}

_repositoryWrapper.ArtRepository.Delete(art);

await _repositoryWrapper.SaveChangesAsync(cancellationToken);

return Result.Ok(Unit.Value);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using FluentResults;
using MediatR;
using Streetcode.BLL.DTO.Media.Art;

namespace Streetcode.BLL.MediatR.Media.Art.Update
{
public record UpdateArtCommand(ArtUpdateDto ArtDto) : IRequest<Result<ArtDTO>>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using AutoMapper;
using FluentResults;
using MediatR;
using Streetcode.BLL.DTO.Media.Art;
using Streetcode.BLL.Resources;
using Streetcode.DAL.Repositories.Interfaces.Base;

namespace Streetcode.BLL.MediatR.Media.Art.Update
{
public class UpdateArtHandler : IRequestHandler<UpdateArtCommand, Result<ArtDTO>>
{
private readonly IMapper _mapper;
private readonly IRepositoryWrapper _repositoryWrapper;

public UpdateArtHandler(IMapper mapper, IRepositoryWrapper repositoryWrapper)
{
_mapper = mapper;
_repositoryWrapper = repositoryWrapper;
}

public async Task<Result<ArtDTO>> Handle(UpdateArtCommand request, CancellationToken cancellationToken)
{
var art = await _repositoryWrapper.ArtRepository.GetFirstOrDefaultAsync(
predicate: a => a.Id == request.ArtDto.Id,
cancellationToken: cancellationToken
);

if (art == null)
{
return Result.Fail(string.Format(ErrorMessages.EntityNotFound, request.ArtDto.Id));
}

_mapper.Map(request.ArtDto, art);

_repositoryWrapper.ArtRepository.Update(art);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);

return Result.Ok(_mapper.Map<ArtDTO>(art));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using FluentResults;
using MediatR;
using Streetcode.BLL.DTO.Media.ArtSlides;

namespace Streetcode.BLL.MediatR.Media.ArtSlide.Create
{
public record CreateArtSlideCommand(CreateStreetcodeArtSlideDto Dto) : IRequest<Result<StreetcodeArtSlideDto>>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using AutoMapper;
using FluentResults;
using MediatR;
using Streetcode.BLL.DTO.Media.ArtSlides;
using Streetcode.BLL.Resources;
using Streetcode.DAL.Entities.Media.Images;
using Streetcode.DAL.Repositories.Interfaces.Base;

namespace Streetcode.BLL.MediatR.Media.ArtSlide.Create
{
public class CreateArtSlideHandler : IRequestHandler<CreateArtSlideCommand, Result<StreetcodeArtSlideDto>>
{
private readonly IMapper _mapper;
private readonly IRepositoryWrapper _repositoryWrapper;

public CreateArtSlideHandler(IMapper mapper, IRepositoryWrapper repositoryWrapper)
{
_mapper = mapper;
_repositoryWrapper = repositoryWrapper;
}

public async Task<Result<StreetcodeArtSlideDto>> Handle(CreateArtSlideCommand request, CancellationToken cancellationToken)
{
var streetcode = await _repositoryWrapper.StreetcodeRepository.GetFirstOrDefaultAsync(
predicate: s => s.Id == request.Dto.StreetcodeId,
cancellationToken: cancellationToken);

if (streetcode == null)
{
return Result.Fail(string.Format(ErrorMessages.StreetcodeNotFound, request.Dto.StreetcodeId));
}

var artIdsFromDto = request.Dto.ArtSlideItems.Select(a => a.ArtId).Distinct().ToList();

var existingArts = await _repositoryWrapper.ArtRepository
.GetAllAsync(a => artIdsFromDto.Contains(a.Id));

if (existingArts.Count() != artIdsFromDto.Count)
{
return Result.Fail(ErrorMessages.ArtsNotFound);
}

using (var transaction = _repositoryWrapper.BeginTransaction())
{
var newSlide = _mapper.Map<StreetcodeArtSlide>(request.Dto);
await _repositoryWrapper.StreetcodeArtSlideRepository.CreateAsync(newSlide);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);

foreach (var artItem in request.Dto.ArtSlideItems)
{
var artExists = await _repositoryWrapper.ArtRepository.GetFirstOrDefaultAsync(
predicate: a => a.Id == artItem.ArtId,
cancellationToken: cancellationToken);

if (artExists == null)
{
return Result.Fail($"Art with id {artItem.ArtId} does not exist.");
}
await _repositoryWrapper.ArtSlideItemRepository.CreateAsync(new ArtSlideItem
{
SlideId = newSlide.Id,
ArtId = artItem.ArtId,
Index = artItem.Index
});
}

await _repositoryWrapper.SaveChangesAsync(cancellationToken);

transaction.Complete();

return Result.Ok(_mapper.Map<StreetcodeArtSlideDto>(newSlide));
}
}
}
}
Loading
Loading