Skip to content

Commit

Permalink
Send message returns 500 (#199)
Browse files Browse the repository at this point in the history
* chore: uncomment postgres volume to reduce work to switch database

* fix: split repositories to simplify having different queries per db provider

* refactor: convert ConnectionString field to a property
  • Loading branch information
tnotheis authored Jul 11, 2023
1 parent f352466 commit 4da3313
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 62 deletions.
23 changes: 19 additions & 4 deletions Common/src/Common.Infrastructure/IServiceCollectionExtension.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,30 @@
using Enmeshed.Common.Infrastructure.Persistence.Repository;
using Microsoft.Extensions.DependencyInjection;
using Enmeshed.Common.Infrastructure.Persistence.Context;
using Dapper;
using Microsoft.Extensions.Options;

namespace Enmeshed.Common.Infrastructure;
public static class IServiceCollectionExtension
{
public static IServiceCollection AddMetricStatusesRepository(this IServiceCollection services, Action<MetricStatusesDapperContextOptions> configureOptions)
private const string SQLSERVER = "SqlServer";
private const string POSTGRES = "Postgres";

public static IServiceCollection AddMetricStatusesRepository(this IServiceCollection services, string provider, string connectionString)
{
services.AddTransient<IMetricStatusesRepository, MetricStatusesRepository>();
services.Configure(configureOptions);
services.AddTransient<MetricStatusesDapperContext>();
services.Configure<MetricStatusesRepositoryOptions>(options => options.ConnectionString = connectionString);

SqlMapper.AddTypeHandler(new MetricKeyTypeHandler());

switch (provider)
{
case SQLSERVER:
services.AddTransient<IMetricStatusesRepository, SqlServerMetricStatusesRepository>();
break;
case POSTGRES:
services.AddTransient<IMetricStatusesRepository, PostgresMetricStatusesRepository>();
break;
}

return services;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Enmeshed.Common.Infrastructure.Persistence.Repository;

public class MetricStatusesRepositoryOptions
{
public string ConnectionString { get; set; } = string.Empty;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Dapper;
using Enmeshed.BuildingBlocks.Domain;
using Enmeshed.DevelopmentKit.Identity.ValueObjects;
using Microsoft.Extensions.Options;
using Npgsql;

namespace Enmeshed.Common.Infrastructure.Persistence.Repository;

public class PostgresMetricStatusesRepository : IMetricStatusesRepository
{
private const string QUERY = """SELECT * FROM "MetricStatuses" WHERE "Owner" = @identityAddress AND "MetricKey" = ANY(@keys)""";

private readonly MetricStatusesRepositoryOptions _options;

public PostgresMetricStatusesRepository(IOptions<MetricStatusesRepositoryOptions> options)
{
_options = options.Value;
}

public async Task<IEnumerable<MetricStatus>> GetMetricStatuses(IdentityAddress identityAddress, IEnumerable<MetricKey> keys)
{
await using var connection = new NpgsqlConnection(_options.ConnectionString);

var metricStatuses = await connection.QueryAsync<MetricStatus>(QUERY, new
{
identityAddress = identityAddress.ToString(),
keys = keys.Select(x => x.Value).ToArray()
});

return metricStatuses;
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
using Dapper;
using Enmeshed.BuildingBlocks.Domain;
using Enmeshed.DevelopmentKit.Identity.ValueObjects;
using Enmeshed.Common.Infrastructure.Persistence.Context;
using Dapper;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Options;

namespace Enmeshed.Common.Infrastructure.Persistence.Repository;

public class MetricStatusesRepository : IMetricStatusesRepository
public class SqlServerMetricStatusesRepository : IMetricStatusesRepository
{
private const string QUERY = "SELECT * FROM MetricStatuses WHERE Owner = @identityAddress and MetricKey IN @keys";
private const string QUERY = "SELECT * FROM MetricStatuses WHERE Owner = @identityAddress AND MetricKey IN @keys";

private readonly MetricStatusesRepositoryOptions _options;

public MetricStatusesRepository(MetricStatusesDapperContext context)
public SqlServerMetricStatusesRepository(IOptions<MetricStatusesRepositoryOptions> options)
{
_context = context;
_options = options.Value;
}

private readonly MetricStatusesDapperContext _context;

public async Task<IEnumerable<MetricStatus>> GetMetricStatuses(IdentityAddress identityAddress, IEnumerable<MetricKey> keys)
{
using var connection = _context.Connection;
await using var connection = new SqlConnection(_options.ConnectionString);

var metricStatuses = await connection.QueryAsync<MetricStatus>(QUERY, new
{
identityAddress = identityAddress.ToString(),
keys = keys.Select(x => x.Value)
keys = keys.Select(x => x.Value).ToArray()
});

return metricStatuses;
}
}
20 changes: 9 additions & 11 deletions ConsumerApi/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,7 @@
})
.MigrateDbContext<FilesDbContext>()
.MigrateDbContext<RelationshipsDbContext>()
.MigrateDbContext<QuotasDbContext>((context, sp) =>
{
new QuotasDbContextSeed(sp.GetRequiredService<DevicesDbContext>()).SeedAsync(context).Wait();
})
.MigrateDbContext<QuotasDbContext>((context, sp) => { new QuotasDbContextSeed(sp.GetRequiredService<DevicesDbContext>()).SeedAsync(context).Wait(); })
.MigrateDbContext<MessagesDbContext>()
.MigrateDbContext<SynchronizationDbContext>()
.MigrateDbContext<TokensDbContext>()
Expand All @@ -90,12 +87,13 @@ static void ConfigureServices(IServiceCollection services, IConfiguration config
.AddModule<QuotasModule>(configuration)
.AddModule<RelationshipsModule>(configuration)
.AddModule<SynchronizationModule>(configuration)
.AddModule<TokensModule>(configuration)
.AddMetricStatusesRepository(c =>
{
c.ConnectionString = configuration.GetSection("Modules:Quotas:Infrastructure:SqlDatabase:ConnectionString").Value;
c.Provider = configuration.GetSection("Modules:Quotas:Infrastructure:SqlDatabase:Provider").Value;
});
.AddModule<TokensModule>(configuration);

var quotasSqlDatabaseConfiguration = configuration.GetSection("Modules:Quotas:Infrastructure:SqlDatabase");
var quotasDbProvider = quotasSqlDatabaseConfiguration.GetValue<string>("Provider") ?? throw new ArgumentException("Quotas database connection string is not configured");
var quotasDbConnectionString = quotasSqlDatabaseConfiguration.GetValue<string>("ConnectionString") ?? throw new ArgumentException("Quotas database connection string is not configured");
services.AddMetricStatusesRepository(quotasDbProvider, quotasDbConnectionString);

services.AddTransient<IQuotaChecker, QuotaCheckerImpl>();

services.ConfigureAndValidate<BackboneConfiguration>(configuration.Bind);
Expand Down Expand Up @@ -185,4 +183,4 @@ static void LoadConfiguration(WebApplicationBuilder webApplicationBuilder, strin
webApplicationBuilder.Configuration.AddEnvironmentVariables();
webApplicationBuilder.Configuration.AddCommandLine(strings);
webApplicationBuilder.Configuration.AddAzureAppConfiguration();
}
}
4 changes: 2 additions & 2 deletions docker-compose/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ volumes:
rabbitmq-volume:
mssql-server-volume:
external: true
#postgres-volume:
#external: true
postgres-volume:
external: true
#azure-storage-emulator-volume:
# external: true
elastic_data:

0 comments on commit 4da3313

Please sign in to comment.