MapResourceSyncProvider.cs 1.97 KB
using MassTransit.Mediator;
using Microsoft.Extensions.Logging;
using Rcs.Application.MessageBus.Commands;
using Rcs.Application.Services.Sync;
using Rcs.Domain.Repositories;

namespace Rcs.Infrastructure.Services.Sync;

/// <summary>
/// 地图资源同步提供者
/// @author zzy
/// </summary>
public class MapResourceSyncProvider : ISyncProvider
{
    private readonly ILogger<MapResourceSyncProvider> _logger;
    private readonly IMapRepository _mapRepository;
    private readonly IMediator _mediator;

    public string TaskType => SyncTaskTypes.MapResource;

    public MapResourceSyncProvider(
        ILogger<MapResourceSyncProvider> logger,
        IMapRepository mapRepository,
        IMediator mediator)
    {
        _logger = logger;
        _mapRepository = mapRepository;
        _mediator = mediator;
    }

    public async Task<IEnumerable<ISyncTask>> GetSyncTasksAsync(CancellationToken cancellationToken = default)
    {
        var maps = await _mapRepository.GetAllAsync(cancellationToken);
        return maps
            .Where(m => m.ResourceAutoSync && !string.IsNullOrWhiteSpace(m.ResourceUrl))
            .Select(MapSyncTask.FromMapResource);
    }

    public async Task ExecuteSyncAsync(ISyncTask task, CancellationToken cancellationToken = default)
    {
        if (task is not MapSyncTask mapTask)
            return;

        _logger.LogInformation("[地图资源同步] 开始同步: MapId={MapId}", mapTask.MapId);

        var client = _mediator.CreateRequestClient<SyncMapResourceCommand>();
        var response = await client.GetResponse<Application.Common.ApiResponse>(
            new SyncMapResourceCommand { MapId = mapTask.MapId },
            cancellationToken);

        if (response.Message.Success)
            _logger.LogInformation("[地图资源同步] 同步成功: MapId={MapId}", mapTask.MapId);
        else
            _logger.LogWarning("[地图资源同步] 同步失败: MapId={MapId}, Message={Message}", mapTask.MapId, response.Message.Message);
    }
}