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
Line 
1using ChapterX.Application.Abstractions;
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;
11 private readonly IGenreRepository _genreRepository;
12 private readonly IHasGenreRepository _hasGenreRepository;
13 private readonly IApplicationDbContext _context;
14 private readonly ILogger<AddHandler> _logger;
15
16 public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, IApplicationDbContext context, ILogger<AddHandler> logger)
17 {
18 _storyRepository = storyRepository;
19 _genreRepository = genreRepository;
20 _hasGenreRepository = hasGenreRepository;
21 _context = context;
22 _logger = logger;
23 }
24
25 public async Task<AddResponse> Handle(AddRequest request, CancellationToken cancellationToken)
26 {
27 await using var transaction = await _context.BeginTransactionAsync(cancellationToken);
28 try
29 {
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 };
40
41 await _storyRepository.AddAsync(story, cancellationToken);
42
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
54 {
55 await transaction.RollbackAsync(cancellationToken);
56 throw;
57 }
58 }
59 }
60}
Note: See TracBrowser for help on using the repository browser.