Skip to content

Commit d54400c

Browse files
committed
2 parents 29451af + fc37239 commit d54400c

9 files changed

Lines changed: 183 additions & 43 deletions

File tree

api/.editorconfig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ dotnet_style_require_accessibility_modifiers = for_non_interface_members
4545
dotnet_style_coalesce_expression = true
4646
dotnet_style_collection_initializer = true
4747
dotnet_style_explicit_tuple_names = true
48-
dotnet_style_namespace_match_folder = true
48+
dotnet_style_namespace_match_folder = false
4949
dotnet_style_null_propagation = true
5050
dotnet_style_object_initializer = true
5151
dotnet_style_operator_placement_when_wrapping = beginning_of_line
@@ -111,7 +111,7 @@ csharp_style_prefer_readonly_struct_member = true
111111
# Code-block preferences
112112
csharp_prefer_braces = true:silent
113113
csharp_prefer_simple_using_statement = true:suggestion
114-
csharp_style_namespace_declarations = block_scoped:silent
114+
csharp_style_namespace_declarations = file_scoped:silent
115115
csharp_style_prefer_method_group_conversion = true:silent
116116
csharp_style_prefer_primary_constructors = true:suggestion
117117
csharp_style_prefer_top_level_statements = true:silent

api/Api/AppSettings.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Core;
2+
3+
namespace Api;
4+
5+
public class AppSettings : Settings
6+
{
7+
public DatabaseSettings Database { get; private set; }
8+
//public IConfiguration Configuration { get; private set; }
9+
//public IHostEnvironment Environment { get; private set; }
10+
//public bool IsProduction => Environment.IsProduction();
11+
//public bool IsDevelopment => Environment.IsDevelopment();
12+
13+
public AppSettings(IConfiguration configuration, IHostEnvironment environment)
14+
{
15+
configuration.GetConnectionString("DefaultConnection").ThrowIfNull();
16+
17+
//Configuration = configuration;
18+
//Environment = environment;
19+
Database = new DatabaseSettings(configuration["Database:AccountName"]?.ToString(), configuration.GetConnectionString("DefaultConnection"));
20+
}
21+
}
22+
23+
public static class AppSettingsExtensions
24+
{
25+
public static AppSettings AddAppSettings(this IServiceCollection services, IWebHostEnvironment environment)
26+
{
27+
var configuration = new ConfigurationBuilder()
28+
.AddJsonFile("appsettings.json")
29+
.AddJsonFile($"appsettings.{environment.EnvironmentName}.json", optional: true)
30+
.AddUserSecrets<Program>()
31+
.AddEnvironmentVariables()
32+
.Build();
33+
services.AddSingleton<IConfiguration>(configuration);
34+
35+
var appSettings = new AppSettings(configuration, environment);
36+
services.AddSingleton<Settings>(appSettings);
37+
return appSettings;
38+
}
39+
}

api/Api/Program.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
});
2424

2525
var corsPolicyName = "MyAllowedCorsOrigins";
26+
builder.Services.AddAppSettings(builder.Environment);
2627
builder.Services.AddCorsPolicy(corsPolicyName);
2728
builder.Services.RegisterServices(builder.Configuration);
2829
builder.Services.ConfigureAuth(builder.Configuration);
@@ -55,7 +56,11 @@
5556
using (var scope = app.Services.CreateScope())
5657
{
5758
var services = scope.ServiceProvider;
58-
var context = services.GetRequiredService<EfDbContext>();
59+
DbContext context;
60+
if (app.Environment.IsDevelopment())
61+
context = services.GetRequiredService<EfDbContext>();
62+
else
63+
context = services.GetRequiredService<CosmosDbContext>();
5964
context.Database.Migrate();
6065
}
6166

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"Logging": {
3+
"LogLevel": {
4+
"Default": "Information",
5+
"Microsoft.AspNetCore": "Warning"
6+
}
7+
},
8+
"Database": {
9+
"AccountName": "cosno-account"
10+
},
11+
"ConnectionStrings": {
12+
"DefaultConnection": "Data Source=localhost;Initial Catalog=GamifyWorkout;TrustServerCertificate=true;Integrated Security=true;"
13+
}
14+
}

api/Core/ArgumentExtensions.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System.Net;
2+
3+
namespace Core;
4+
5+
public static class ArgumentExtensions
6+
{
7+
public static T ThrowIfNull<T>(this T obj, string message = null)
8+
{
9+
if (obj == null)
10+
{
11+
throw new ArgumentNullException(message ?? $"Argument was null.");
12+
}
13+
return obj;
14+
}
15+
16+
public static string ThrowIfNullOrEmpty(this string str, string message = null)
17+
{
18+
if (string.IsNullOrEmpty(str))
19+
{
20+
throw new ArgumentNullException(message ?? $"Argument was null or empty.");
21+
}
22+
return str;
23+
}
24+
25+
public static async Task ThrowIfNotSuccessful(this Task<HttpStatusCode> statusCode)
26+
{
27+
if (await statusCode != HttpStatusCode.OK)
28+
throw new HttpRequestException($"Request failed with status code: {statusCode}");
29+
}
30+
31+
public static string ThrowIfNotMinLength(this string str, int length)
32+
{
33+
if (string.IsNullOrEmpty(str) || str.Length < length)
34+
throw new ArgumentException($"String length must be at least {length} characters.");
35+
return str;
36+
}
37+
}

api/Core/Settings.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+

2+
//using Microsoft.Extensions.Configuration;
3+
4+
using System.Xml.Linq;
5+
6+
namespace Core;
7+
8+
public interface Settings
9+
{
10+
public DatabaseSettings Database { get; }
11+
//public IConfiguration Configuration { get; }
12+
//public IHostEnvironment Environment { get; }
13+
//public bool IsProduction { get; }
14+
//public bool IsDevelopment { get; }
15+
}
16+
17+
public struct DatabaseSettings(string? accountName, string connectionString)
18+
{
19+
public string? AccountName { get; } = accountName;
20+
public string ConnectionString { get; } = connectionString;
21+
}
22+

api/Database/Database.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
<ItemGroup>
1010
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.9" />
11+
<PackageReference Include="Microsoft.EntityFrameworkCore.Cosmos" Version="9.0.9" />
1112
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.9" />
1213
</ItemGroup>
1314

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Core;
2+
using Microsoft.EntityFrameworkCore;
3+
4+
namespace Database;
5+
6+
public class CosmosDbContext : EfDbContext
7+
{
8+
private readonly Settings _settings;
9+
10+
public CosmosDbContext(Settings appSettings, DbContextOptions<EfDbContext> options) : base(options)
11+
{
12+
_settings = appSettings;
13+
}
14+
15+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
16+
{
17+
optionsBuilder.UseCosmos(_settings.Database.ConnectionString, _settings.Database.AccountName);
18+
19+
base.OnConfiguring(optionsBuilder);
20+
}
21+
}
22+
Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,50 @@
11
using Core;
22
using Microsoft.EntityFrameworkCore;
33

4-
namespace Database
4+
namespace Database;
5+
6+
public class EfDbContext : DbContext
57
{
6-
public class EfDbContext : DbContext
7-
{
8-
public DbSet<User> Users { get; set; }
9-
public DbSet<Gym> Gyms { get; set; }
10-
public DbSet<GymEquipment> GymEquipment { get; set; }
11-
public DbSet<Equipment> Equipment { get; set; }
12-
public DbSet<WorkoutLog> WorkoutLog { get; set; }
13-
public DbSet<Schedule> Schedule { get; set; }
8+
public DbSet<User> Users { get; set; }
9+
public DbSet<Gym> Gyms { get; set; }
10+
public DbSet<GymEquipment> GymEquipment { get; set; }
11+
public DbSet<Equipment> Equipment { get; set; }
12+
public DbSet<WorkoutLog> WorkoutLog { get; set; }
13+
public DbSet<Schedule> Schedule { get; set; }
1414

15-
public EfDbContext(DbContextOptions<EfDbContext> options) : base(options) { }
15+
public EfDbContext(DbContextOptions<EfDbContext> options) : base(options) { }
1616

17-
protected override void OnModelCreating(ModelBuilder modelBuilder)
18-
{
19-
modelBuilder.Entity<WorkoutLog>().HasKey(wl => new { wl.ScheduleId, wl.ExerciseId, wl.Date });
20-
}
17+
protected override void OnModelCreating(ModelBuilder modelBuilder)
18+
{
19+
modelBuilder.Entity<WorkoutLog>().HasKey(wl => new { wl.ScheduleId, wl.ExerciseId, wl.Date });
20+
}
2121

22-
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
22+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
23+
{
24+
optionsBuilder.UseSeeding((context, _) =>
2325
{
24-
optionsBuilder.UseSeeding((context, _) =>
25-
{
26-
context.Set<User>().ExecuteDelete();
27-
var userId = context.Set<User>().Add(new User { Email = "jburditt@mailinator.com", FirstName = "Jebb", LastName = "Burditt", Username = "jburditt" }).Entity.Id;
28-
29-
context.Set<Equipment>().ExecuteDelete();
30-
var equipmentId = new Guid[4];
31-
equipmentId[0] = context.Set<Equipment>().Add(new Equipment { Icon = "dumbbells", Name = "Dumbbells" }).Entity.Id;
32-
equipmentId[1] = context.Set<Equipment>().Add(new Equipment { Icon = "bench", Name = "Bench" }).Entity.Id;
33-
equipmentId[2] = context.Set<Equipment>().Add(new Equipment { Icon = "resistbands", Name = "Resistance Bands" }).Entity.Id;
34-
equipmentId[3] = context.Set<Equipment>().Add(new Equipment { Icon = "stabilityball", Name = "Stability Ball" }).Entity.Id;
35-
36-
context.Set<Gym>().ExecuteDelete();
37-
var gymId = context.Set<Gym>().Add(new Gym { Name = "Home", UserId = userId.Value }).Entity.Id;
38-
context.Set<Gym>().Add(new Gym { Name = "Globe Fitness", UserId = userId.Value });
39-
40-
context.Set<GymEquipment>().ExecuteDelete();
41-
context.Set<GymEquipment>().Add(new Core.GymEquipment { EquipmentId = equipmentId[0], GymId = gymId });
42-
context.Set<GymEquipment>().Add(new Core.GymEquipment { EquipmentId = equipmentId[1], GymId = gymId });
43-
context.Set<GymEquipment>().Add(new Core.GymEquipment { EquipmentId = equipmentId[2], GymId = gymId });
44-
context.Set<GymEquipment>().Add(new Core.GymEquipment { EquipmentId = equipmentId[3], GymId = gymId });
45-
46-
context.SaveChanges();
47-
});
48-
}
26+
context.Set<User>().ExecuteDelete();
27+
var userId = context.Set<User>().Add(new User { Email = "jburditt@mailinator.com", FirstName = "Jebb", LastName = "Burditt", Username = "jburditt" }).Entity.Id;
28+
29+
context.Set<Equipment>().ExecuteDelete();
30+
var equipmentId = new Guid[4];
31+
equipmentId[0] = context.Set<Equipment>().Add(new Equipment { Icon = "dumbbells", Name = "Dumbbells" }).Entity.Id;
32+
equipmentId[1] = context.Set<Equipment>().Add(new Equipment { Icon = "bench", Name = "Bench" }).Entity.Id;
33+
equipmentId[2] = context.Set<Equipment>().Add(new Equipment { Icon = "resistbands", Name = "Resistance Bands" }).Entity.Id;
34+
equipmentId[3] = context.Set<Equipment>().Add(new Equipment { Icon = "stabilityball", Name = "Stability Ball" }).Entity.Id;
35+
36+
context.Set<Gym>().ExecuteDelete();
37+
var gymId = context.Set<Gym>().Add(new Gym { Name = "Home", UserId = userId.Value }).Entity.Id;
38+
context.Set<Gym>().Add(new Gym { Name = "Globe Fitness", UserId = userId.Value });
39+
40+
context.Set<GymEquipment>().ExecuteDelete();
41+
context.Set<GymEquipment>().Add(new Core.GymEquipment { EquipmentId = equipmentId[0], GymId = gymId });
42+
context.Set<GymEquipment>().Add(new Core.GymEquipment { EquipmentId = equipmentId[1], GymId = gymId });
43+
context.Set<GymEquipment>().Add(new Core.GymEquipment { EquipmentId = equipmentId[2], GymId = gymId });
44+
context.Set<GymEquipment>().Add(new Core.GymEquipment { EquipmentId = equipmentId[3], GymId = gymId });
45+
46+
context.SaveChanges();
47+
});
4948
}
5049
}
50+

0 commit comments

Comments
 (0)