using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Fengling.Platform.Domain.AggregatesModel.GatewayAggregate;
namespace Fengling.Platform.Infrastructure;
///
/// 服务实例存储实现
///
public class InstanceStore : IInstanceStore
where TContext : PlatformDbContext
{
private readonly TContext _context;
private readonly DbSet _instances;
public InstanceStore(TContext context)
{
_context = context;
_instances = context.GwServiceInstances;
}
public void Dispose() { }
public virtual Task FindByIdAsync(string? id, CancellationToken cancellationToken = default)
{
if (id == null) return Task.FromResult(null);
return _instances.FirstOrDefaultAsync(i => i.Id == id, cancellationToken);
}
public virtual Task FindByClusterIdAsync(string clusterId, CancellationToken cancellationToken = default)
{
return _instances.FirstOrDefaultAsync(i => i.ClusterId == clusterId && !i.IsDeleted, cancellationToken);
}
public virtual Task FindByDestinationAsync(string clusterId, string destinationId, CancellationToken cancellationToken = default)
{
return _instances.FirstOrDefaultAsync(i => i.ClusterId == clusterId && i.DestinationId == destinationId && !i.IsDeleted, cancellationToken);
}
public virtual async Task> GetAllAsync(CancellationToken cancellationToken = default)
{
return await _instances.Where(i => !i.IsDeleted).ToListAsync(cancellationToken);
}
public virtual async Task> GetPagedAsync(int page, int pageSize, string? clusterId = null,
InstanceHealth? health = null, InstanceStatus? status = null, CancellationToken cancellationToken = default)
{
var query = _instances.AsQueryable();
if (!string.IsNullOrEmpty(clusterId))
query = query.Where(i => i.ClusterId.Contains(clusterId));
if (health.HasValue)
query = query.Where(i => i.Health == (int)health.Value);
if (status.HasValue)
query = query.Where(i => i.Status == (int)status.Value);
return await query
.Where(i => !i.IsDeleted)
.OrderByDescending(i => i.CreatedTime)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToListAsync(cancellationToken);
}
public virtual async Task GetCountAsync(string? clusterId = null,
InstanceHealth? health = null, InstanceStatus? status = null, CancellationToken cancellationToken = default)
{
var query = _instances.AsQueryable();
if (!string.IsNullOrEmpty(clusterId))
query = query.Where(i => i.ClusterId.Contains(clusterId));
if (health.HasValue)
query = query.Where(i => i.Health == (int)health.Value);
if (status.HasValue)
query = query.Where(i => i.Status == (int)status.Value);
return await query.Where(i => !i.IsDeleted).CountAsync(cancellationToken);
}
public virtual async Task CreateAsync(GwServiceInstance instance, CancellationToken cancellationToken = default)
{
_instances.Add(instance);
await _context.SaveChangesAsync(cancellationToken);
return IdentityResult.Success;
}
public virtual async Task UpdateAsync(GwServiceInstance instance, CancellationToken cancellationToken = default)
{
instance.UpdatedTime = DateTime.UtcNow;
_instances.Update(instance);
await _context.SaveChangesAsync(cancellationToken);
return IdentityResult.Success;
}
public virtual async Task DeleteAsync(GwServiceInstance instance, CancellationToken cancellationToken = default)
{
// 软删除
instance.IsDeleted = true;
instance.UpdatedTime = DateTime.UtcNow;
_instances.Update(instance);
await _context.SaveChangesAsync(cancellationToken);
return IdentityResult.Success;
}
}