danylokhodus's picture
init
b9c7f0e
Raw
History Blame Contribute Delete
3.26 kB
using FlowAPI.Application.DTOs.Sync;
using FlowAPI.Application.Interfaces;
using FlowAPI.Domain.Entities;
namespace FlowAPI.Application.Services
{
public class SyncService : ISyncService
{
private readonly ITaskNodeRepository _nodeRepo;
private readonly IEdgeRepository _edgeRepo;
public SyncService(ITaskNodeRepository nodeRepo, IEdgeRepository edgeRepo)
{
_nodeRepo = nodeRepo;
_edgeRepo = edgeRepo;
}
public async Task<SyncResponseDto> SyncChangesAsync(Guid userId, SyncRequestDto request)
{
try
{
// 1. Process Node Deletions
foreach (var id in request.DeletedNodeIds)
{
await _nodeRepo.DeleteAsync(id);
}
// 2. Process Edge Deletions
foreach (var id in request.DeletedEdgeIds)
{
await _edgeRepo.DeleteAsync(id);
}
// 3. Process New Nodes
foreach (var dto in request.NewNodes)
{
var node = new TaskNode
{
Id = Guid.NewGuid(),
GraphId = dto.GraphId,
Label = dto.Label,
PosX = dto.PosX,
PosY = dto.PosY,
State = dto.State
};
await _nodeRepo.CreateAsync(node);
}
// 4. Process Updated Nodes
foreach (var dto in request.UpdatedNodes)
{
var node = await _nodeRepo.GetByIdAsync(dto.Id);
if (node != null)
{
if (dto.Label != null) node.Label = dto.Label;
if (dto.PosX.HasValue) node.PosX = dto.PosX.Value;
if (dto.PosY.HasValue) node.PosY = dto.PosY.Value;
if (dto.State.HasValue) node.State = dto.State.Value;
await _nodeRepo.UpdateAsync(node);
}
}
// 5. Process New Edges
foreach (var dto in request.NewEdges)
{
var edge = new Edge
{
Id = Guid.NewGuid(),
GraphId = dto.GraphId,
FromNodeId = dto.FromNodeId,
ToNodeId = dto.ToNodeId,
Condition = dto.Condition
};
await _edgeRepo.CreateAsync(edge);
}
return new SyncResponseDto
{
Success = true,
Message = "Synchronization completed successfully.",
ServerTime = DateTime.UtcNow
};
}
catch (Exception ex)
{
return new SyncResponseDto
{
Success = false,
Message = $"Sync failed: {ex.Message}",
ServerTime = DateTime.UtcNow
};
}
}
}
}