using ErrorOr;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.Extensions.Logging;
using MuiCharts.Domain.Models;
using MuiCharts.Domain.Repositories;
namespace MuiCharts.Infrastructure.Repositories;
///
/// Represents a repository for tracks.
///
/// The data context.
/// The logger.
public class TrackRepository(
DataContext context,
ILogger logger
) : ITrackRepository
{
private readonly DataContext _context = context;
private readonly ILogger _logger = logger;
///
public async Task> AddOrUpdateTrackAsync(Track track)
{
try
{
_logger.LogInformation("Adding or updating track {track}", track);
if (!IsValidTrack(track))
{
_logger.LogInformation("Points with first ID {FirstId} and second ID {SecondId} do not exist", track.FirstId, track.SecondId);
return Error.Validation(description: "One or both specified points do not exist.");
}
Track entity = UpsertTrack(track, out bool isNewlyCreated);
await _context.SaveChangesAsync();
if (!isNewlyCreated)
return (Track?)null;
return entity;
}
catch (Exception e)
{
_logger.LogError(e, "Error adding or updating track {track}", track);
return Error.Failure();
}
}
///
public async Task> AddTrackAsync(Track track)
{
try
{
_logger.LogInformation("Adding track with first ID {FirstId} and second ID {SecondId}", track.FirstId, track.SecondId);
if (!IsValidTrack(track))
{
_logger.LogInformation("Points with first ID {FirstId} and second ID {SecondId} do not exist", track.FirstId, track.SecondId);
return Error.Validation(description: "One or both specified points do not exist.");
}
if (_context.Tracks.Any(t => t.FirstId == track.FirstId && t.SecondId == track.SecondId))
{
_logger.LogInformation("Track with first ID {FirstId} and second ID {SecondId} already exists", track.FirstId, track.SecondId);
return Error.Conflict();
}
EntityEntry