79 lines
2.4 KiB
C#
79 lines
2.4 KiB
C#
using Extrudex.Domain.Entities;
|
||
using Extrudex.Domain.Interfaces;
|
||
using Extrudex.Infrastructure.Data;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using Microsoft.Extensions.Logging;
|
||
|
||
namespace Extrudex.Infrastructure.Services;
|
||
|
||
/// <summary>
|
||
/// EF Core–backed implementation of the filament usage service.
|
||
/// Persists usage records to the database and provides query methods
|
||
/// for retrieving usage by print job or spool.
|
||
/// </summary>
|
||
public class FilamentUsageService : IFilamentUsageService
|
||
{
|
||
private readonly ExtrudexDbContext _dbContext;
|
||
private readonly ILogger<FilamentUsageService> _logger;
|
||
|
||
public FilamentUsageService(
|
||
ExtrudexDbContext dbContext,
|
||
ILogger<FilamentUsageService> logger)
|
||
{
|
||
_dbContext = dbContext;
|
||
_logger = logger;
|
||
}
|
||
|
||
/// <inheritdoc />
|
||
public async Task<FilamentUsage> RecordUsageAsync(
|
||
Guid printJobId,
|
||
Guid spoolId,
|
||
Guid printerId,
|
||
decimal gramsUsed,
|
||
decimal mmExtruded,
|
||
string? notes = null,
|
||
CancellationToken cancellationToken = default)
|
||
{
|
||
var usage = new FilamentUsage
|
||
{
|
||
PrintJobId = printJobId,
|
||
SpoolId = spoolId,
|
||
PrinterId = printerId,
|
||
GramsUsed = gramsUsed,
|
||
MmExtruded = mmExtruded,
|
||
RecordedAt = DateTime.UtcNow,
|
||
Notes = notes
|
||
};
|
||
|
||
_dbContext.FilamentUsages.Add(usage);
|
||
await _dbContext.SaveChangesAsync(cancellationToken);
|
||
|
||
_logger.LogInformation(
|
||
"Recorded filament usage: {Grams}g / {Mm}mm for print job {JobId} on spool {SpoolId}",
|
||
gramsUsed, mmExtruded, printJobId, spoolId);
|
||
|
||
return usage;
|
||
}
|
||
|
||
/// <inheritdoc />
|
||
public async Task<IReadOnlyList<FilamentUsage>> GetByPrintJobAsync(
|
||
Guid printJobId,
|
||
CancellationToken cancellationToken = default)
|
||
{
|
||
return await _dbContext.FilamentUsages
|
||
.Where(u => u.PrintJobId == printJobId)
|
||
.OrderByDescending(u => u.RecordedAt)
|
||
.ToListAsync(cancellationToken);
|
||
}
|
||
|
||
/// <inheritdoc />
|
||
public async Task<IReadOnlyList<FilamentUsage>> GetBySpoolAsync(
|
||
Guid spoolId,
|
||
CancellationToken cancellationToken = default)
|
||
{
|
||
return await _dbContext.FilamentUsages
|
||
.Where(u => u.SpoolId == spoolId)
|
||
.OrderByDescending(u => u.RecordedAt)
|
||
.ToListAsync(cancellationToken);
|
||
}
|
||
} |