diff --git a/CleanArchitecture/CleanArchitecture.Application/Contracts/Persistence/IUnitOfWork.cs b/CleanArchitecture/CleanArchitecture.Application/Contracts/Persistence/IUnitOfWork.cs index 6cc9154..1c5bacb 100644 --- a/CleanArchitecture/CleanArchitecture.Application/Contracts/Persistence/IUnitOfWork.cs +++ b/CleanArchitecture/CleanArchitecture.Application/Contracts/Persistence/IUnitOfWork.cs @@ -4,6 +4,9 @@ namespace CleanArchitecture.Application.Contracts.Persistence { public interface IUnitOfWork: IDisposable { + + IStreamerRepository StreamerRepository { get; } + IVideoRepository VideoRepository { get; } IAsyncRepository Repository() where T : BaseDomainModel; Task Complete(); diff --git a/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/CreateStreamer/CreateStreamerCommandHandler.cs b/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/CreateStreamer/CreateStreamerCommandHandler.cs index 2abdbc1..b2f6c39 100644 --- a/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/CreateStreamer/CreateStreamerCommandHandler.cs +++ b/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/CreateStreamer/CreateStreamerCommandHandler.cs @@ -8,11 +8,11 @@ using Microsoft.Extensions.Logging; namespace CleanArchitecture.Application.Features.Streamers.Commands.CreateStreamer { - public class CreateStreamerCommandHandler(IStreamerRepository _streamerRepository, IMapper _mapper, + public class CreateStreamerCommandHandler(IUnitOfWork _unitOfWork, IMapper _mapper, IEmailService _emailService, ILogger _logger) : IRequestHandler { - private readonly IStreamerRepository streamerRepository = _streamerRepository; + private readonly IUnitOfWork unitOfWork = _unitOfWork; private readonly IMapper mapper = _mapper; private readonly IEmailService emailService = _emailService; private readonly ILogger logger = _logger; @@ -20,10 +20,19 @@ namespace CleanArchitecture.Application.Features.Streamers.Commands.CreateStream public async Task Handle(CreateStreamerCommand request, CancellationToken cancellationToken) { var streamerEntity = mapper.Map(request); - var newStreamer = await streamerRepository.AddAsync(streamerEntity); - logger.LogInformation($"Streamer {newStreamer.Id} is successfully created."); - await SendEmail(newStreamer); - return newStreamer.Id; + unitOfWork.StreamerRepository.AddEntity(streamerEntity); + var response = await unitOfWork.Complete(); + if(response > 0) + { + logger.LogInformation($"Streamer {streamerEntity.Id} is successfully created."); + await SendEmail(streamerEntity); + return streamerEntity.Id; + } + else + { + throw new Exception("Failed to create the streamer."); + } + } private async Task SendEmail(Streamer streamer) diff --git a/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/DeleteStreamer/DeleteStreamerCommandHandler.cs b/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/DeleteStreamer/DeleteStreamerCommandHandler.cs index 40f3cb2..c4e954d 100644 --- a/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/DeleteStreamer/DeleteStreamerCommandHandler.cs +++ b/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/DeleteStreamer/DeleteStreamerCommandHandler.cs @@ -9,27 +9,28 @@ namespace CleanArchitecture.Application.Features.Streamers.Commands.DeleteStream { public class DeleteStreamerCommandHandler : IRequestHandler { - private readonly IStreamerRepository streamerRepository; + private readonly IUnitOfWork unitOfWork; private readonly IMapper mapper; private readonly ILogger logger; - public DeleteStreamerCommandHandler(IStreamerRepository streamerRepository, IMapper mapper, ILogger logger) + public DeleteStreamerCommandHandler(IUnitOfWork unitOfWork, IMapper mapper, ILogger logger) { - this.streamerRepository = streamerRepository; + this.unitOfWork = unitOfWork; this.mapper = mapper; this.logger = logger; } public async Task Handle(DeleteStreamerCommand request, CancellationToken cancellationToken) { - var streamerToDelete = await streamerRepository.GetByIdAsync(request.Id); + var streamerToDelete = await unitOfWork.StreamerRepository.GetByIdAsync(request.Id); if (streamerToDelete == null) { logger.LogError($"Streamer with id {request.Id} not found."); throw new NotFoundException(nameof(Streamer), request.Id); } - await streamerRepository.DeleteAsync(streamerToDelete); + unitOfWork.StreamerRepository.DeleteEntity(streamerToDelete); + await unitOfWork.Complete(); logger.LogInformation($"Streamer {streamerToDelete.Id} is successfully deleted."); return Unit.Value; diff --git a/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/UpdateStreamer/UpdateStreamerCommandHandler.cs b/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/UpdateStreamer/UpdateStreamerCommandHandler.cs index 5254f93..ffbf23f 100644 --- a/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/UpdateStreamer/UpdateStreamerCommandHandler.cs +++ b/CleanArchitecture/CleanArchitecture.Application/Features/Streamers/Commands/UpdateStreamer/UpdateStreamerCommandHandler.cs @@ -9,21 +9,21 @@ namespace CleanArchitecture.Application.Features.Streamers.Commands.UpdateStream { public class UpdateStreamerCommandHandler : IRequestHandler { - private readonly IStreamerRepository streamerRepository; + private readonly IUnitOfWork unitOfWork; private readonly IMapper mapper; private readonly ILogger logger; - public UpdateStreamerCommandHandler(IStreamerRepository streamerRepository, + public UpdateStreamerCommandHandler(IUnitOfWork unitOfWork, IMapper mapper, ILogger logger) { - this.streamerRepository = streamerRepository; + this.unitOfWork = unitOfWork; this.mapper = mapper; this.logger = logger; } public async Task Handle(UpdateStreamerCommand request, CancellationToken cancellationToken) { - var streamerToUpdate = await streamerRepository.GetByIdAsync(request.Id); + var streamerToUpdate = await unitOfWork.StreamerRepository.GetByIdAsync(request.Id); if(streamerToUpdate == null) { logger.LogError($"Streamer with id {request.Id} not found."); @@ -32,7 +32,8 @@ namespace CleanArchitecture.Application.Features.Streamers.Commands.UpdateStream mapper.Map(request, streamerToUpdate, typeof(UpdateStreamerCommand), typeof(Streamer)); - await streamerRepository.UpdateAsync(streamerToUpdate); + unitOfWork.StreamerRepository.UpdateEntity(streamerToUpdate); + await unitOfWork.Complete(); logger.LogInformation($"Streamer {streamerToUpdate.Id} is successfully updated."); diff --git a/CleanArchitecture/CleanArchitecture.Application/Features/Videos/Queries/GetVideosList/GetVideosListQueryHandler.cs b/CleanArchitecture/CleanArchitecture.Application/Features/Videos/Queries/GetVideosList/GetVideosListQueryHandler.cs index dfad332..ffcd0b0 100644 --- a/CleanArchitecture/CleanArchitecture.Application/Features/Videos/Queries/GetVideosList/GetVideosListQueryHandler.cs +++ b/CleanArchitecture/CleanArchitecture.Application/Features/Videos/Queries/GetVideosList/GetVideosListQueryHandler.cs @@ -4,16 +4,16 @@ using MediatR; namespace CleanArchitecture.Application.Features.Videos.Queries.GetVideosList { - public class GetVideosListQueryHandler(IVideoRepository _videoRepository, IMapper _mapper) : + public class GetVideosListQueryHandler(IUnitOfWork _unitOfWork, IMapper _mapper) : IRequestHandler> { - private readonly IVideoRepository videoRepository = _videoRepository; + private readonly IUnitOfWork unitOfWork = _unitOfWork; private readonly IMapper mapper = _mapper; public async Task> Handle(GetVideosListQuery request, CancellationToken cancellationToken) { - var videoList = await videoRepository.GetVideoByUserName(request.UserName); + var videoList = await unitOfWork.VideoRepository.GetVideoByUserName(request.UserName); return mapper.Map>(videoList); } } diff --git a/CleanArchitecture/CleanArchitecture.Data/Persistence/UnitOfWork.cs b/CleanArchitecture/CleanArchitecture.Data/Repositories/UnitOfWork.cs similarity index 68% rename from CleanArchitecture/CleanArchitecture.Data/Persistence/UnitOfWork.cs rename to CleanArchitecture/CleanArchitecture.Data/Repositories/UnitOfWork.cs index 40233d9..4525df8 100644 --- a/CleanArchitecture/CleanArchitecture.Data/Persistence/UnitOfWork.cs +++ b/CleanArchitecture/CleanArchitecture.Data/Repositories/UnitOfWork.cs @@ -1,15 +1,22 @@ using CleanArchitecture.Application.Contracts.Persistence; using CleanArchitecture.Domain.Common; -using CleanArchitecture.Infrastructure.Repositories; +using CleanArchitecture.Infrastructure.Persistence; using System.Collections; -namespace CleanArchitecture.Infrastructure.Persistence +namespace CleanArchitecture.Infrastructure.Repositories { public class UnitOfWork : IUnitOfWork { private Hashtable repositories; - private readonly StreamerDbContext context; - + private readonly StreamerDbContext context; + + private IVideoRepository videoRepository; + private IStreamerRepository streamerRepository; + + + public IVideoRepository VideoRepository => videoRepository ?? new VideoRepository(context); + public IStreamerRepository StreamerRepository => streamerRepository ?? new StreamerRepository(context); + public UnitOfWork(StreamerDbContext _context) { context = _context; @@ -29,12 +36,12 @@ namespace CleanArchitecture.Infrastructure.Persistence public IAsyncRepository Repository() where T : BaseDomainModel { - if(repositories == null) + if (repositories == null) { repositories = new Hashtable(); } var type = typeof(T).Name; - if(!repositories.ContainsKey(type)) + if (!repositories.ContainsKey(type)) { var repositoryType = typeof(RepositoryBase<>); var repositoryInstance = Activator.CreateInstance(repositoryType.MakeGenericType(typeof(T)), context);