Ignore:
Timestamp:
04/28/26 14:53:32 (2 months ago)
Author:
kikisrbinoska <srbinoskakristina07@…>
Branches:
main
Children:
b373fea
Parents:
dc383dd
Message:

Added transactions and pooling

Location:
ChapterX.Application
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • ChapterX.Application/Abstractions/IApplicationDbContext.cs

    rdc383dd rd300631  
    11using Microsoft.EntityFrameworkCore;
     2using Microsoft.EntityFrameworkCore.Storage;
    23using UserEntity = ChapterX.Domain.Entities.User;
    34using StoryEntity = ChapterX.Domain.Entities.Story;
     
    4041        DbSet<NeedApprovalEntity> NeedApprovals { get; }
    4142        Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
     43        Task<IDbContextTransaction> BeginTransactionAsync(CancellationToken cancellationToken = default);
    4244    }
    4345}
  • ChapterX.Application/Auth/RegisterHandler.cs

    rdc383dd rd300631  
     1using ChapterX.Application.Abstractions;
    12using ChapterX.Domain.Repositories;
    23using MediatR;
     
    89        private readonly IUserRepository _userRepository;
    910        private readonly IWriterRepository _writerRepository;
     11        private readonly IApplicationDbContext _context;
    1012
    11         public RegisterHandler(IUserRepository userRepository, IWriterRepository writerRepository)
     13        public RegisterHandler(IUserRepository userRepository, IWriterRepository writerRepository, IApplicationDbContext context)
    1214        {
    1315            _userRepository = userRepository;
    1416            _writerRepository = writerRepository;
     17            _context = context;
    1518        }
    1619
     
    2124                throw new InvalidOperationException("Email already in use.");
    2225
    23             var user = new Domain.Entities.User
     26            await using var transaction = await _context.BeginTransactionAsync(cancellationToken);
     27            try
    2428            {
    25                 Username = request.Username,
    26                 Email = request.Email,
    27                 Name = request.Name,
    28                 Surname = request.Surname,
    29                 Password = BCrypt.Net.BCrypt.HashPassword(request.Password),
    30                 CreatedAt = DateTime.UtcNow,
    31                 UpdatedAt = DateTime.UtcNow
    32             };
     29                var user = new Domain.Entities.User
     30                {
     31                    Username = request.Username,
     32                    Email = request.Email,
     33                    Name = request.Name,
     34                    Surname = request.Surname,
     35                    Password = BCrypt.Net.BCrypt.HashPassword(request.Password),
     36                    CreatedAt = DateTime.UtcNow,
     37                    UpdatedAt = DateTime.UtcNow
     38                };
    3339
    34             await _userRepository.AddAsync(user, cancellationToken);
     40                await _userRepository.AddAsync(user, cancellationToken);
    3541
    36             var writer = new Domain.Entities.Writer { Id = user.Id };
    37             await _writerRepository.AddAsync(writer, cancellationToken);
     42                var writer = new Domain.Entities.Writer { Id = user.Id };
     43                await _writerRepository.AddAsync(writer, cancellationToken);
    3844
    39             return new RegisterResponse(user.Id, user.Username, user.Email);
     45                await transaction.CommitAsync(cancellationToken);
     46                return new RegisterResponse(user.Id, user.Username, user.Email);
     47            }
     48            catch
     49            {
     50                await transaction.RollbackAsync(cancellationToken);
     51                throw;
     52            }
    4053        }
    4154    }
  • ChapterX.Application/Story/Commands/AddHandler.cs

    rdc383dd rd300631  
     1using ChapterX.Application.Abstractions;
    12using ChapterX.Domain.Repositories;
    23using MediatR;
     
    1011        private readonly IGenreRepository _genreRepository;
    1112        private readonly IHasGenreRepository _hasGenreRepository;
     13        private readonly IApplicationDbContext _context;
    1214        private readonly ILogger<AddHandler> _logger;
    1315
    14         public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, ILogger<AddHandler> logger)
     16        public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, IApplicationDbContext context, ILogger<AddHandler> logger)
    1517        {
    1618            _storyRepository = storyRepository;
    1719            _genreRepository = genreRepository;
    1820            _hasGenreRepository = hasGenreRepository;
     21            _context = context;
    1922            _logger = logger;
    2023        }
     
    2225        public async Task<AddResponse> Handle(AddRequest request, CancellationToken cancellationToken)
    2326        {
    24             var story = new Domain.Entities.Story
     27            await using var transaction = await _context.BeginTransactionAsync(cancellationToken);
     28            try
    2529            {
    26                 MatureContent = request.MatureContent,
    27                 ShortDescription = request.ShortDescription,
    28                 Image = request.Image,
    29                 Content = request.Content,
    30                 UserId = request.UserId,
    31                 CreatedAt = DateTime.UtcNow,
    32                 UpdatedAt = DateTime.UtcNow
    33             };
     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                };
    3440
    35             await _storyRepository.AddAsync(story, cancellationToken);
     41                await _storyRepository.AddAsync(story, cancellationToken);
    3642
    37             foreach (var genreName in request.Genres ?? [])
     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
    3854            {
    39                 var genre = await _genreRepository.GetByNameAsync(genreName, cancellationToken);
    40                 if (genre == null) continue;
    41                 await _hasGenreRepository.AddAsync(new Domain.Entities.HasGenre { StoryId = story.Id, GenreId = genre.Id }, cancellationToken);
     55                await transaction.RollbackAsync(cancellationToken);
     56                throw;
    4257            }
    43 
    44             return new AddResponse(story.Id);
    4558        }
    4659    }
Note: See TracChangeset for help on using the changeset viewer.