Skip to content

Commit 3be0301

Browse files
User Tool (#70)
- added tool for updating email and password - changed tools to fetch the db connection string from api appsettings.json by default - refactored some functionality into common tools assembly
1 parent 8310b49 commit 3be0301

File tree

14 files changed

+166
-6
lines changed

14 files changed

+166
-6
lines changed

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.4" />
1919
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.4" />
2020
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.4" />
21+
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.4" />
2122
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="9.0.4" />
2223
<PackageVersion Include="Microsoft.Extensions.Identity.Stores" Version="9.0.4" />
2324
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.4" />

TeamUp.slnx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
</Folder>
3434
<Folder Name="/tools/">
3535
<Project Path="tools/TeamUp.Tools.Aspire/TeamUp.Tools.Aspire.csproj" />
36+
<Project Path="tools/TeamUp.Tools.Common/TeamUp.Tools.Common.csproj" />
3637
<Project Path="tools/TeamUp.Tools.Seeder/TeamUp.Tools.Seeder.csproj" />
38+
<Project Path="tools/TeamUp.Tools.UserTools/TeamUp.Tools.UserTools.csproj" />
3739
</Folder>
3840
</Solution>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
using System.Runtime.CompilerServices;
22

33
[assembly: InternalsVisibleTo("TeamUp.Tests.EndToEnd")]
4+
[assembly: InternalsVisibleTo("TeamUp.Tools.Common")]
5+
[assembly: InternalsVisibleTo("TeamUp.Tools.UserTools")]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace TeamUp.Infrastructure.Options;
22

3-
internal interface IApplicationOptions
3+
public interface IApplicationOptions
44
{
55
public static abstract string SectionName { get; }
66
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System.Reflection;
2+
using Microsoft.Extensions.Configuration;
3+
4+
namespace TeamUp.Tools.Common;
5+
6+
public static class ConfigurationBuilderExtensions
7+
{
8+
public static IConfigurationBuilder AddApiAppSettings(this IConfigurationBuilder builder, out Stream stream)
9+
{
10+
var assembly = Assembly.GetExecutingAssembly();
11+
var resourceName = "TeamUp.Tools.Common.api-appsettings.json";
12+
13+
stream = assembly.GetManifestResourceStream(resourceName)!;
14+
if (stream is null)
15+
{
16+
throw new Exception("api-appsettings not found.");
17+
}
18+
19+
return builder.AddJsonStream(stream);
20+
}
21+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.Extensions.Configuration;
2+
using Microsoft.Extensions.Options;
3+
using TeamUp.Infrastructure.Options;
4+
5+
namespace TeamUp.Tools.Common;
6+
7+
public static class ConfigurationExtensions
8+
{
9+
public static IOptions<TOptions> GetOptions<TOptions>(this IConfiguration config) where TOptions : class, IApplicationOptions
10+
{
11+
var options = Activator.CreateInstance<TOptions>();
12+
config.GetSection(TOptions.SectionName).Bind(options);
13+
return Options.Create(options);
14+
}
15+
16+
public static string GetConnectionString(this IConfiguration config, string? connectionStringOverride)
17+
{
18+
if (!string.IsNullOrWhiteSpace(connectionStringOverride))
19+
{
20+
return connectionStringOverride;
21+
}
22+
23+
return config.GetOptions<DatabaseOptions>().Value.ConnectionString;
24+
}
25+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
using System.Diagnostics;
22

3-
namespace TeamUp.Tools.Seeder;
3+
namespace TeamUp.Tools.Common;
44

5-
internal sealed class ConsoleTimer : IAsyncDisposable
5+
public sealed class ConsoleTimer : IAsyncDisposable
66
{
77
private readonly int _timerX, _timerY;
88
private readonly long _startTimestamp;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<ItemGroup>
4+
<ProjectReference Include="..\..\src\TeamUp.Infrastructure\TeamUp.Infrastructure.csproj" />
5+
</ItemGroup>
6+
7+
<ItemGroup>
8+
<EmbeddedResource Include="api-appsettings.json" />
9+
</ItemGroup>
10+
11+
</Project>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../src/TeamUp.Api/appsettings.json

tools/TeamUp.Tools.Seeder/Program.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.Extensions.Configuration;
23
using Npgsql;
34
using Respawn;
45
using Respawn.Graph;
56
using TeamUp.Infrastructure.Persistence;
7+
using TeamUp.Tools.Common;
68

79
namespace TeamUp.Tools.Seeder;
810

@@ -13,7 +15,7 @@ static class Program
1315
/// <param name="seedDb">true means the tool will try to seed the database according to seeding strategy</param>
1416
/// <param name="clearDb">true means the tool will clear the database</param>
1517
static async Task<int> Main(
16-
string connectionString,
18+
string? connectionString = null,
1719
string? seedingInstructionsJSON = null,
1820
bool seedDb = true,
1921
bool clearDb = false)
@@ -38,16 +40,24 @@ static async Task<int> Main(
3840
return 1;
3941
}
4042

43+
var config = new ConfigurationBuilder()
44+
.AddApiAppSettings(out var apiStream)
45+
.Build();
46+
47+
await apiStream.DisposeAsync();
48+
49+
var dbConnectionString = config.GetConnectionString(connectionStringOverride: connectionString);
50+
4151
if (clearDb)
4252
{
4353
Console.Write("Clearing database...");
44-
await ConsoleTimer.CallAsync(() => ClearDatabaseAsync(connectionString), default);
54+
await ConsoleTimer.CallAsync(() => ClearDatabaseAsync(dbConnectionString), default);
4555
}
4656

4757
if (seedDb)
4858
{
4959
var options = new DbContextOptionsBuilder<ApplicationDbContext>()
50-
.UseNpgsql(connectionString)
60+
.UseNpgsql(dbConnectionString)
5161
.Options;
5262

5363
await using (var dbContext = new ApplicationDbContext(options))

0 commit comments

Comments
 (0)