< Summary

Information
Class: OzonRepositories.Data.BitrixStockClearJobRepository
Assembly: OzonRepositories
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/BitrixStockClearJobRepository.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 72
Coverable lines: 72
Total lines: 148
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 16
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/BitrixStockClearJobRepository.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonDomains.Models;
 3using OzonRepositories.Context;
 4
 5namespace OzonRepositories.Data;
 6
 7public class BitrixStockClearJobRepository : IBitrixStockClearJobRepository
 8{
 9    private readonly ApplicationDbContext _context;
 10
 011    public BitrixStockClearJobRepository(ApplicationDbContext context)
 12    {
 013        _context = context;
 014    }
 15
 16    public async Task<BitrixStockClearExecution> CreateExecutionAsync(
 17        string jobId,
 18        string? hangfireJobId,
 19        string? userId,
 20        string? userName,
 21        IReadOnlyList<BitrixStockClearItem> items,
 22        string triggerType = "Manual",
 23        CancellationToken cancellationToken = default)
 24    {
 025        var execution = new BitrixStockClearExecution
 026        {
 027            JobId = jobId,
 028            HangfireJobId = hangfireJobId,
 029            Status = BitrixStockClearExecutionStatus.Running,
 030            TriggerType = triggerType,
 031            StartedAt = DateTime.UtcNow,
 032            TotalItems = items.Count,
 033            TriggeredByUserId = userId,
 034            TriggeredByUserName = userName,
 035            Items = items.ToList()
 036        };
 37
 038        _context.BitrixStockClearExecutions.Add(execution);
 039        await _context.SaveChangesAsync(cancellationToken);
 040        return execution;
 041    }
 42
 43    public async Task UpdateHangfireJobIdAsync(long executionId, string hangfireJobId,
 44        CancellationToken cancellationToken = default)
 45    {
 046        var execution = await _context.BitrixStockClearExecutions.FindAsync(new object[] { executionId }, cancellationTo
 047        if (execution == null)
 48        {
 049            return;
 50        }
 51
 052        execution.HangfireJobId = hangfireJobId;
 053        await _context.SaveChangesAsync(cancellationToken);
 054    }
 55
 56    public async Task<BitrixStockClearExecution?> GetExecutionByIdAsync(long id, bool includeItems = false,
 57        CancellationToken cancellationToken = default)
 58    {
 059        var query = _context.BitrixStockClearExecutions.AsQueryable();
 060        if (includeItems)
 61        {
 062            query = query.Include(e => e.Items.OrderBy(i => i.SortOrder));
 63        }
 64
 065        return await query.FirstOrDefaultAsync(e => e.Id == id, cancellationToken);
 066    }
 67
 68    public async Task<BitrixStockClearExecution?> GetExecutionByJobIdAsync(string jobId, bool includeItems = false,
 69        CancellationToken cancellationToken = default)
 70    {
 071        var query = _context.BitrixStockClearExecutions.AsQueryable();
 072        if (includeItems)
 73        {
 074            query = query.Include(e => e.Items.OrderBy(i => i.SortOrder));
 75        }
 76
 077        return await query.FirstOrDefaultAsync(e => e.JobId == jobId, cancellationToken);
 078    }
 79
 80    public async Task UpdateItemResultAsync(long itemId, string status, string? errorMessage,
 81        CancellationToken cancellationToken = default)
 82    {
 083        var item = await _context.BitrixStockClearItems.FindAsync(new object[] { itemId }, cancellationToken);
 084        if (item == null)
 85        {
 086            return;
 87        }
 88
 089        item.Status = status;
 090        item.ErrorMessage = errorMessage;
 091        item.ProcessedAt = DateTime.UtcNow;
 092        await _context.SaveChangesAsync(cancellationToken);
 093    }
 94
 95    public async Task UpdateExecutionCountersAsync(long executionId, int successCount, int failedCount,
 96        CancellationToken cancellationToken = default)
 97    {
 098        var execution = await _context.BitrixStockClearExecutions.FindAsync(new object[] { executionId }, cancellationTo
 099        if (execution == null)
 100        {
 0101            return;
 102        }
 103
 0104        execution.SuccessCount = successCount;
 0105        execution.FailedCount = failedCount;
 0106        await _context.SaveChangesAsync(cancellationToken);
 0107    }
 108
 109    public async Task CompleteExecutionAsync(long executionId, string status, string? errorMessage,
 110        CancellationToken cancellationToken = default)
 111    {
 0112        var execution = await _context.BitrixStockClearExecutions.FindAsync(new object[] { executionId }, cancellationTo
 0113        if (execution == null)
 114        {
 0115            return;
 116        }
 117
 0118        execution.Status = status;
 0119        execution.ErrorMessage = errorMessage;
 0120        execution.CompletedAt = DateTime.UtcNow;
 0121        execution.DurationMs = (long)(execution.CompletedAt.Value - execution.StartedAt).TotalMilliseconds;
 0122        await _context.SaveChangesAsync(cancellationToken);
 0123    }
 124
 125    public async Task<(List<BitrixStockClearExecution> Items, int Total)> GetExecutionsPageAsync(int page, int pageSize,
 126        CancellationToken cancellationToken = default)
 127    {
 0128        if (page < 1)
 129        {
 0130            page = 1;
 131        }
 132
 0133        if (pageSize < 1)
 134        {
 0135            pageSize = 20;
 136        }
 137
 0138        var query = _context.BitrixStockClearExecutions.AsNoTracking();
 0139        var total = await query.CountAsync(cancellationToken);
 0140        var items = await query
 0141            .OrderByDescending(e => e.StartedAt)
 0142            .Skip((page - 1) * pageSize)
 0143            .Take(pageSize)
 0144            .ToListAsync(cancellationToken);
 145
 0146        return (items, total);
 0147    }
 148}