using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Fengling.Platform.Domain.AggregatesModel.GatewayAggregate; namespace Fengling.Platform.Infrastructure; /// /// 集群存储实现 /// public class ClusterStore : IClusterStore where TContext : PlatformDbContext { private readonly TContext _context; private readonly DbSet _clusters; public ClusterStore(TContext context) { _context = context; _clusters = context.GwClusters; } public void Dispose() { } public virtual Task FindByIdAsync(string? id, CancellationToken cancellationToken = default) { if (id == null) return Task.FromResult(null); return _clusters.FirstOrDefaultAsync(c => c.Id == id, cancellationToken); } public virtual Task FindByClusterIdAsync(string clusterId, CancellationToken cancellationToken = default) { return _clusters.FirstOrDefaultAsync(c => c.ClusterId == clusterId && !c.IsDeleted, cancellationToken); } public virtual async Task> GetAllAsync(CancellationToken cancellationToken = default) { return await _clusters.Where(c => !c.IsDeleted).ToListAsync(cancellationToken); } public virtual async Task> GetPagedAsync(int page, int pageSize, string? clusterId = null, string? name = null, int? status = null, CancellationToken cancellationToken = default) { var query = _clusters.AsQueryable(); if (!string.IsNullOrEmpty(clusterId)) query = query.Where(c => c.ClusterId.Contains(clusterId)); if (!string.IsNullOrEmpty(name)) query = query.Where(c => c.Name.Contains(name)); if (status.HasValue) query = query.Where(c => c.Status == status.Value); return await query .Where(c => !c.IsDeleted) .OrderByDescending(c => c.CreatedTime) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(cancellationToken); } public virtual async Task GetCountAsync(string? clusterId = null, string? name = null, int? status = null, CancellationToken cancellationToken = default) { var query = _clusters.AsQueryable(); if (!string.IsNullOrEmpty(clusterId)) query = query.Where(c => c.ClusterId.Contains(clusterId)); if (!string.IsNullOrEmpty(name)) query = query.Where(c => c.Name.Contains(name)); if (status.HasValue) query = query.Where(c => c.Status == status.Value); return await query.Where(c => !c.IsDeleted).CountAsync(cancellationToken); } public virtual async Task CreateAsync(GwCluster cluster, CancellationToken cancellationToken = default) { _clusters.Add(cluster); await _context.SaveChangesAsync(cancellationToken); return IdentityResult.Success; } public virtual async Task UpdateAsync(GwCluster cluster, CancellationToken cancellationToken = default) { cluster.UpdatedTime = DateTime.UtcNow; _clusters.Update(cluster); await _context.SaveChangesAsync(cancellationToken); return IdentityResult.Success; } public virtual async Task DeleteAsync(GwCluster cluster, CancellationToken cancellationToken = default) { // 软删除 cluster.IsDeleted = true; cluster.UpdatedTime = DateTime.UtcNow; _clusters.Update(cluster); await _context.SaveChangesAsync(cancellationToken); return IdentityResult.Success; } public virtual async Task AddDestinationAsync(string clusterId, GwDestination destination, CancellationToken cancellationToken = default) { var cluster = await _clusters.FirstOrDefaultAsync(c => c.ClusterId == clusterId && !c.IsDeleted, cancellationToken); if (cluster == null) return null; cluster.Destinations.Add(destination); cluster.UpdatedTime = DateTime.UtcNow; await _context.SaveChangesAsync(cancellationToken); return cluster; } public virtual async Task UpdateDestinationAsync(string clusterId, string destinationId, GwDestination destination, CancellationToken cancellationToken = default) { var cluster = await _clusters .Include(c => c.Destinations) .FirstOrDefaultAsync(c => c.ClusterId == clusterId && !c.IsDeleted, cancellationToken); if (cluster == null) return null; var existingDest = cluster.Destinations.FirstOrDefault(d => d.DestinationId == destinationId); if (existingDest == null) return null; existingDest.Address = destination.Address; existingDest.Health = destination.Health; existingDest.Weight = destination.Weight; existingDest.HealthStatus = destination.HealthStatus; existingDest.Status = destination.Status; cluster.UpdatedTime = DateTime.UtcNow; await _context.SaveChangesAsync(cancellationToken); return cluster; } public virtual async Task RemoveDestinationAsync(string clusterId, string destinationId, CancellationToken cancellationToken = default) { var cluster = await _clusters .Include(c => c.Destinations) .FirstOrDefaultAsync(c => c.ClusterId == clusterId && !c.IsDeleted, cancellationToken); if (cluster == null) return null; var destination = cluster.Destinations.FirstOrDefault(d => d.DestinationId == destinationId); if (destination == null) return null; cluster.Destinations.Remove(destination); cluster.UpdatedTime = DateTime.UtcNow; await _context.SaveChangesAsync(cancellationToken); return cluster; } }