source: ChapterX.Application/Story/Commands/AddHandler.cs@ 0b502c2

main
Last change on this file since 0b502c2 was d300631, checked in by kikisrbinoska <srbinoskakristina07@…>, 2 months ago

Added transactions and pooling

  • Property mode set to 100644
File size: 2.4 KB
RevLine 
[d300631]1using ChapterX.Application.Abstractions;
[877c13c]2using ChapterX.Domain.Repositories;
3using MediatR;
4using Microsoft.Extensions.Logging;
5
6namespace ChapterX.Application.Story.Commands
7{
8 public class AddHandler : IRequestHandler<AddRequest, AddResponse>
9 {
10 private readonly IStoryRepository _storyRepository;
[73b69b2]11 private readonly IGenreRepository _genreRepository;
12 private readonly IHasGenreRepository _hasGenreRepository;
[d300631]13 private readonly IApplicationDbContext _context;
[877c13c]14 private readonly ILogger<AddHandler> _logger;
15
[d300631]16 public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, IApplicationDbContext context, ILogger<AddHandler> logger)
[877c13c]17 {
18 _storyRepository = storyRepository;
[73b69b2]19 _genreRepository = genreRepository;
20 _hasGenreRepository = hasGenreRepository;
[d300631]21 _context = context;
[877c13c]22 _logger = logger;
23 }
24
25 public async Task<AddResponse> Handle(AddRequest request, CancellationToken cancellationToken)
26 {
[d300631]27 await using var transaction = await _context.BeginTransactionAsync(cancellationToken);
28 try
[877c13c]29 {
[d300631]30 var story = new Domain.Entities.Story
31 {
32 MatureContent = request.MatureContent,
33 ShortDescription = request.ShortDescription,
34 Image = request.Image,
35 Content = request.Content,
36 UserId = request.UserId,
37 CreatedAt = DateTime.UtcNow,
38 UpdatedAt = DateTime.UtcNow
39 };
[877c13c]40
[d300631]41 await _storyRepository.AddAsync(story, cancellationToken);
[877c13c]42
[d300631]43 foreach (var genreName in request.Genres ?? [])
44 {
45 var genre = await _genreRepository.GetByNameAsync(genreName, cancellationToken);
46 if (genre == null) continue;
47 await _hasGenreRepository.AddAsync(new Domain.Entities.HasGenre { StoryId = story.Id, GenreId = genre.Id }, cancellationToken);
48 }
49
50 await transaction.CommitAsync(cancellationToken);
51 return new AddResponse(story.Id);
52 }
53 catch
[73b69b2]54 {
[d300631]55 await transaction.RollbackAsync(cancellationToken);
56 throw;
[73b69b2]57 }
[877c13c]58 }
59 }
60}
Note: See TracBrowser for help on using the repository browser.