< Summary

Information
Class: Api.Database.Utils.EFTransactionDIAccessorService
Assembly: Api
File(s): /home/runner/work/ProjectRead.ing/ProjectRead.ing/Api/Database/Utils/EFTransactionDIAccessorService.cs
Line coverage
40%
Covered lines: 15
Uncovered lines: 22
Coverable lines: 37
Total lines: 77
Line coverage: 40.5%
Branch coverage
50%
Covered branches: 7
Total branches: 14
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
BeginOrGetTransaction()0%620%
BeginOrGetTransactionAsync()100%44100%
FinishTransaction()0%620%
System.IDisposable.Dispose()0%620%
DisposeAsync()100%22100%
CommitTX()50%3237.5%
SaveAndCommitTX()100%210%

File(s)

/home/runner/work/ProjectRead.ing/ProjectRead.ing/Api/Database/Utils/EFTransactionDIAccessorService.cs

#LineLine coverage
 1// SPDX-FileCopyrightText: 2026 Alper Çelik <[email protected]>
 2//
 3// SPDX-License-Identifier: AGPL-3.0-or-later
 4
 5using Microsoft.EntityFrameworkCore.Storage;
 6
 7namespace Api.Database.Utils;
 8
 9public interface IEFTransactionDIAccessorService : IAsyncDisposable, IDisposable
 10{
 11    public IDbContextTransaction BeginOrGetTransaction();
 12    public Task<IDbContextTransaction> BeginOrGetTransactionAsync(
 13        CancellationToken? ct = null
 14    );
 15    public ValueTask FinishTransaction();
 16    public ValueTask SaveAndCommitTX(CancellationToken ct = default);
 17    public ValueTask CommitTX(CancellationToken ct = default);
 18}
 19
 120public class EFTransactionDIAccessorService(PGContext db)
 21    : IEFTransactionDIAccessorService
 22{
 23    private IDbContextTransaction? _tx;
 24
 25    public IDbContextTransaction BeginOrGetTransaction()
 026    {
 027        _tx ??= db.Database.BeginTransaction();
 028        return _tx;
 029    }
 30
 31    public async Task<IDbContextTransaction> BeginOrGetTransactionAsync(
 32        CancellationToken? ct = null
 33    )
 134    {
 135        _tx ??= await db.Database.BeginTransactionAsync(
 136            cancellationToken: ct ?? CancellationToken.None
 137        );
 138        return _tx;
 139    }
 40
 41    public async ValueTask FinishTransaction()
 042    {
 043        if (_tx is not null)
 044            await _tx.DisposeAsync();
 45
 046        _tx = null;
 047    }
 48
 49    void IDisposable.Dispose()
 050    {
 051        GC.SuppressFinalize(this);
 052        _tx?.Dispose();
 053    }
 54
 55    public async ValueTask DisposeAsync()
 156    {
 157        GC.SuppressFinalize(this);
 158        if (_tx is not null)
 159            await _tx.DisposeAsync();
 160    }
 61
 62    public async ValueTask CommitTX(CancellationToken ct = default)
 163    {
 164        if (_tx is not null)
 065        {
 066            await _tx.CommitAsync(ct);
 067            await _tx.DisposeAsync();
 068            _tx = null;
 069        }
 170    }
 71
 72    public async ValueTask SaveAndCommitTX(CancellationToken ct = default)
 073    {
 074        await db.SaveChangesAsync(ct);
 075        await CommitTX(ct);
 076    }
 77}