Skip to content

Commit 010870d

Browse files
committed
Adding more tables to sql
1 parent 57b79d0 commit 010870d

31 files changed

+1173
-37
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Abstractions;
2+
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using DbContexts;
6+
7+
public interface IUpsertHelper
8+
{
9+
Task Upsert<TEntity>(ServiceControlDbContextBase dbContext, TEntity entity, CancellationToken cancellationToken) where TEntity : class;
10+
}

src/ServiceControl.Persistence.Sql.Core/DbContexts/ServiceControlDbContextBase.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,18 @@ protected ServiceControlDbContextBase(DbContextOptions options) : base(options)
1111
}
1212

1313
public DbSet<TrialLicenseEntity> TrialLicenses { get; set; }
14+
public DbSet<EndpointSettingsEntity> EndpointSettings { get; set; }
15+
public DbSet<EventLogItemEntity> EventLogItems { get; set; }
16+
public DbSet<MessageRedirectsEntity> MessageRedirects { get; set; }
1417

1518
protected override void OnModelCreating(ModelBuilder modelBuilder)
1619
{
1720
base.OnModelCreating(modelBuilder);
1821

1922
modelBuilder.ApplyConfiguration(new TrialLicenseConfiguration());
23+
modelBuilder.ApplyConfiguration(new EndpointSettingsConfiguration());
24+
modelBuilder.ApplyConfiguration(new EventLogItemConfiguration());
25+
modelBuilder.ApplyConfiguration(new MessageRedirectsConfiguration());
2026

2127
OnModelCreatingProvider(modelBuilder);
2228
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Entities;
2+
3+
public class EndpointSettingsEntity
4+
{
5+
public required string Name { get; set; }
6+
public bool TrackInstances { get; set; }
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Entities;
2+
3+
using System;
4+
5+
public class EventLogItemEntity
6+
{
7+
public required string Id { get; set; }
8+
public required string Description { get; set; }
9+
public int Severity { get; set; }
10+
public DateTime RaisedAt { get; set; }
11+
public string? RelatedTo { get; set; } // Stored as JSON array
12+
public string? Category { get; set; }
13+
public string? EventType { get; set; }
14+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Entities;
2+
3+
public class MessageRedirectsEntity
4+
{
5+
public required string Id { get; set; }
6+
public required string ETag { get; set; }
7+
public DateTime LastModified { get; set; }
8+
public required string RedirectsJson { get; set; }
9+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
namespace ServiceControl.Persistence.Sql.Core.EntityConfigurations;
2+
3+
using Entities;
4+
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
6+
7+
class EndpointSettingsConfiguration : IEntityTypeConfiguration<EndpointSettingsEntity>
8+
{
9+
public void Configure(EntityTypeBuilder<EndpointSettingsEntity> builder)
10+
{
11+
builder.ToTable("EndpointSettings");
12+
13+
builder.HasKey(e => e.Name);
14+
15+
builder.Property(e => e.Name)
16+
.IsRequired()
17+
.HasMaxLength(500);
18+
19+
builder.Property(e => e.TrackInstances)
20+
.IsRequired();
21+
}
22+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
namespace ServiceControl.Persistence.Sql.Core.EntityConfigurations;
2+
3+
using Entities;
4+
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
6+
7+
class EventLogItemConfiguration : IEntityTypeConfiguration<EventLogItemEntity>
8+
{
9+
public void Configure(EntityTypeBuilder<EventLogItemEntity> builder)
10+
{
11+
builder.ToTable("EventLogItems");
12+
13+
builder.HasKey(e => e.Id);
14+
15+
builder.Property(e => e.Id)
16+
.IsRequired()
17+
.HasMaxLength(200);
18+
19+
builder.Property(e => e.Description)
20+
.IsRequired();
21+
22+
builder.Property(e => e.Severity)
23+
.IsRequired();
24+
25+
builder.Property(e => e.RaisedAt)
26+
.IsRequired();
27+
28+
builder.Property(e => e.Category)
29+
.HasMaxLength(200);
30+
31+
builder.Property(e => e.EventType)
32+
.HasMaxLength(200);
33+
34+
builder.Property(e => e.RelatedTo)
35+
.HasMaxLength(4000);
36+
37+
// Index for querying by RaisedAt
38+
builder.HasIndex(e => e.RaisedAt);
39+
}
40+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace ServiceControl.Persistence.Sql.Core.EntityConfigurations;
2+
3+
using Entities;
4+
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
6+
7+
class MessageRedirectsConfiguration : IEntityTypeConfiguration<MessageRedirectsEntity>
8+
{
9+
public void Configure(EntityTypeBuilder<MessageRedirectsEntity> builder)
10+
{
11+
builder.ToTable("MessageRedirects");
12+
13+
builder.HasKey(e => e.Id);
14+
15+
builder.Property(e => e.Id)
16+
.IsRequired()
17+
.HasMaxLength(200);
18+
19+
builder.Property(e => e.ETag)
20+
.IsRequired()
21+
.HasMaxLength(200);
22+
23+
builder.Property(e => e.LastModified)
24+
.IsRequired();
25+
26+
builder.Property(e => e.RedirectsJson)
27+
.IsRequired();
28+
}
29+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Implementation;
2+
3+
using System.Collections.Generic;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using Abstractions;
7+
using DbContexts;
8+
using Entities;
9+
using Microsoft.EntityFrameworkCore;
10+
using Microsoft.Extensions.DependencyInjection;
11+
using ServiceControl.Persistence;
12+
13+
public class EndpointSettingsStore : IEndpointSettingsStore
14+
{
15+
readonly IServiceProvider serviceProvider;
16+
readonly IUpsertHelper upsertHelper;
17+
18+
public EndpointSettingsStore(IServiceProvider serviceProvider, IUpsertHelper upsertHelper)
19+
{
20+
this.serviceProvider = serviceProvider;
21+
this.upsertHelper = upsertHelper;
22+
}
23+
24+
public async IAsyncEnumerable<EndpointSettings> GetAllEndpointSettings()
25+
{
26+
using var scope = serviceProvider.CreateScope();
27+
var dbContext = scope.ServiceProvider.GetRequiredService<ServiceControlDbContextBase>();
28+
29+
var entities = dbContext.EndpointSettings.AsNoTracking().AsAsyncEnumerable();
30+
31+
await foreach (var entity in entities)
32+
{
33+
yield return new EndpointSettings
34+
{
35+
Name = entity.Name,
36+
TrackInstances = entity.TrackInstances
37+
};
38+
}
39+
}
40+
41+
public async Task UpdateEndpointSettings(EndpointSettings settings, CancellationToken cancellationToken)
42+
{
43+
using var scope = serviceProvider.CreateScope();
44+
var dbContext = scope.ServiceProvider.GetRequiredService<ServiceControlDbContextBase>();
45+
46+
var entity = new EndpointSettingsEntity
47+
{
48+
Name = settings.Name,
49+
TrackInstances = settings.TrackInstances
50+
};
51+
52+
await upsertHelper.Upsert(dbContext, entity, cancellationToken);
53+
}
54+
55+
public async Task Delete(string name, CancellationToken cancellationToken)
56+
{
57+
using var scope = serviceProvider.CreateScope();
58+
var dbContext = scope.ServiceProvider.GetRequiredService<ServiceControlDbContextBase>();
59+
60+
await dbContext.EndpointSettings
61+
.Where(e => e.Name == name)
62+
.ExecuteDeleteAsync(cancellationToken);
63+
}
64+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Implementation;
2+
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text.Json;
7+
using System.Threading.Tasks;
8+
using DbContexts;
9+
using Entities;
10+
using Microsoft.EntityFrameworkCore;
11+
using Microsoft.Extensions.DependencyInjection;
12+
using ServiceControl.EventLog;
13+
using ServiceControl.Persistence;
14+
using ServiceControl.Persistence.Infrastructure;
15+
16+
public class EventLogDataStore : IEventLogDataStore
17+
{
18+
readonly IServiceProvider serviceProvider;
19+
20+
public EventLogDataStore(IServiceProvider serviceProvider)
21+
{
22+
this.serviceProvider = serviceProvider;
23+
}
24+
25+
public async Task Add(EventLogItem logItem)
26+
{
27+
using var scope = serviceProvider.CreateScope();
28+
var dbContext = scope.ServiceProvider.GetRequiredService<ServiceControlDbContextBase>();
29+
30+
var entity = new EventLogItemEntity
31+
{
32+
Id = logItem.Id,
33+
Description = logItem.Description,
34+
Severity = (int)logItem.Severity,
35+
RaisedAt = logItem.RaisedAt,
36+
Category = logItem.Category,
37+
EventType = logItem.EventType,
38+
RelatedTo = logItem.RelatedTo != null ? JsonSerializer.Serialize(logItem.RelatedTo) : null
39+
};
40+
41+
await dbContext.EventLogItems.AddAsync(entity);
42+
await dbContext.SaveChangesAsync();
43+
}
44+
45+
public async Task<(IList<EventLogItem> items, long total, string version)> GetEventLogItems(PagingInfo pagingInfo)
46+
{
47+
using var scope = serviceProvider.CreateScope();
48+
var dbContext = scope.ServiceProvider.GetRequiredService<ServiceControlDbContextBase>();
49+
50+
var query = dbContext.EventLogItems
51+
.AsNoTracking()
52+
.OrderByDescending(e => e.RaisedAt);
53+
54+
var total = await query.CountAsync();
55+
56+
var entities = await query
57+
.Skip(pagingInfo.Offset)
58+
.Take(pagingInfo.PageSize)
59+
.ToListAsync();
60+
61+
var items = entities.Select(entity => new EventLogItem
62+
{
63+
Id = entity.Id,
64+
Description = entity.Description,
65+
Severity = (Severity)entity.Severity,
66+
RaisedAt = entity.RaisedAt,
67+
Category = entity.Category,
68+
EventType = entity.EventType,
69+
RelatedTo = entity.RelatedTo != null ? JsonSerializer.Deserialize<List<string>>(entity.RelatedTo) : null
70+
}).ToList();
71+
72+
// Version could be based on the latest RaisedAt timestamp
73+
var version = entities.Any() ? entities.Max(e => e.RaisedAt).Ticks.ToString() : "0";
74+
75+
return (items, total, version);
76+
}
77+
}

0 commit comments

Comments
 (0)