diff --git a/src/Dto/ActivityDto.cs b/src/Dto/ActivityDto.cs index fcb108c..bff6ae6 100644 --- a/src/Dto/ActivityDto.cs +++ b/src/Dto/ActivityDto.cs @@ -16,4 +16,12 @@ public class ActivityDto public int Minimum { get; set; } public float AverageTemperature { get; set; } public bool HasAutoPause { get; set; } + + public int AthleteId { get; set; } + + public int DataSourceId { get; set; } + + public int? TrainingId { get; set; } + + public IEnumerable HeartRates { get; set; } // = new List(); } \ No newline at end of file diff --git a/src/Dto/HeartRateDto.cs b/src/Dto/HeartRateDto.cs index e69de29..12d815e 100644 --- a/src/Dto/HeartRateDto.cs +++ b/src/Dto/HeartRateDto.cs @@ -0,0 +1,13 @@ +public class HeartRateDto +{ + public DateTime Timestamp { get; set; } + public double? Latitude { get; set; } + public double? Longitude { get; set; } + public double? Altitude { get; set; } + public int HeartRate { get; set; } + public int? Cadence { get; set; } + public double? Distance { get; set; } + public double? Speed { get; set; } + public int? Power { get; set; } + public double? Temperature { get; set; } +} \ No newline at end of file diff --git a/src/HeartTrackAPI/AppBootstrap.cs b/src/HeartTrackAPI/AppBootstrap.cs index b0a9d5b..2a7113a 100644 --- a/src/HeartTrackAPI/AppBootstrap.cs +++ b/src/HeartTrackAPI/AppBootstrap.cs @@ -14,8 +14,207 @@ using Microsoft.OpenApi.Models; using Model.Manager; using Model2Entities; using StubAPI; +using StubbedContextLib; using Swashbuckle.AspNetCore.SwaggerGen; namespace HeartTrackAPI; +public class AppBootstrap(IConfiguration configuration) +{ + private IConfiguration Configuration { get; } = configuration; + + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + services.AddEndpointsApiExplorer(); + AddSwagger(services); + AddHeartTrackContextServices(services); + AddModelService(services); + AddIdentityServices(services); + AddApiVersioning(services); + services.AddHealthChecks(); + + } + + private void AddHeartTrackContextServices(IServiceCollection services) + { + string connectionString; + + switch (Environment.GetEnvironmentVariable("TYPE")) + { + case "BDD": + var HOST = System.Environment.GetEnvironmentVariable("HOST"); + var PORT = System.Environment.GetEnvironmentVariable("PORTDB"); + var DATABASE = System.Environment.GetEnvironmentVariable("DATABASE"); + var USERNAME = System.Environment.GetEnvironmentVariable("USERNAME"); + var PASSWORD = System.Environment.GetEnvironmentVariable("PASSWORD"); + + connectionString = $"Server={HOST};port={PORT};database={DATABASE};user={USERNAME};password={PASSWORD}"; + Console.WriteLine("========RUNNING USING THE MYSQL SERVER=============="); + Console.WriteLine(connectionString); + Console.WriteLine(connectionString); + Console.WriteLine("======================"); + // with auth when it was working was'nt here + services.AddDbContext(options => options.UseInMemoryDatabase("AuthDb")); + services.AddDbContext(options => + options.UseMySql($"{connectionString}", new MySqlServerVersion(new Version(10, 11, 1))) + , ServiceLifetime.Singleton); + break; + default: + Console.WriteLine("====== RUNNING USING THE IN SQLLITE DATABASE ======"); + connectionString = Configuration.GetConnectionString("HeartTrackAuthConnection"); + if (!string.IsNullOrWhiteSpace(connectionString)) + { + services.AddDbContext(options => options.UseInMemoryDatabase("AuthDb")); + services.AddDbContext(options => + options.UseSqlite(connectionString), ServiceLifetime.Singleton); + } + else + { + services.AddDbContext(options => options.UseInMemoryDatabase("AuthDb")); + services.AddDbContext(); + } + break; + + } + } + + private void AddModelService(IServiceCollection services) + { + switch (Environment.GetEnvironmentVariable("TYPE")) + { + case "BDD": + services.AddSingleton(provider => new DbDataManager(provider.GetRequiredService())); + break; + case "STUB": + services.AddSingleton(); + break; + default: + services.AddSingleton(provider => + { + provider.GetRequiredService().Database.EnsureCreated(); + return new DbDataManager(provider.GetRequiredService()); + }); + break; + } + + //services.AddTransient(); + } + + private void AddIdentityServices(IServiceCollection services) + { +// services.AddTransient, EmailSender>(); + services.AddAuthorization(); + + services.AddIdentityApiEndpoints() + .AddEntityFrameworkStores(); + //services.AddIdentity() + // .AddEntityFrameworkStores().AddDefaultTokenProviders(); + } + + private void AddApiVersioning(IServiceCollection services) + { + + services.AddApiVersioning(opt => + { + opt.ReportApiVersions = true; + opt.AssumeDefaultVersionWhenUnspecified = true; + opt.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0); +// options.ApiVersionReader = new HeaderApiVersionReader("api-version"); + + opt.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(), + new HeaderApiVersionReader("x-api-version"), + new MediaTypeApiVersionReader("x-api-version")); + }); + + } + private void AddSwagger(IServiceCollection services) + { + services.AddSwaggerGen(options => + { + options.OperationFilter(); + + var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); + options.IncludeXmlComments(xmlPath); + + options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + Description = + "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", + Name = "Authorization", + In = ParameterLocation.Header, + Type = SecuritySchemeType.ApiKey + }); + var scheme = new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "Bearer" + }, + Scheme = "oauth2", + Name = "Bearer", + In = ParameterLocation.Header, + }, + new List() + } + }; + options.AddSecurityRequirement(scheme); + }); + services.AddTransient, SwaggerOptions>(); + services.AddSwaggerGen(options => + { + options.OperationFilter(); + }); + /* services.AddSwaggerGen(options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "HeartTrackAPI", Version = "v1" }); + options.SwaggerDoc("v2", new OpenApiInfo { Title = "HeartTrackAPI", Version = "v2" }); + });*/ + + services.AddVersionedApiExplorer(setup => + { + setup.GroupNameFormat = "'v'VVV"; + setup.SubstituteApiVersionInUrl = true; + }); + + } + + public void Configure(WebApplication app, IWebHostEnvironment env) + { + app.UseHttpsRedirection(); + app.MapIdentityApi(); + + app.MapControllers(); + app.UseAuthorization(); + + app.MapHealthChecks("/health"); + + // Configure the HTTP request pipeline. + if (true) + { + var apiVersionDescriptionProvider = app.Services.GetRequiredService(); + app.UseSwagger(); + app.UseSwaggerUI(); + app.MapSwagger(); + app.UseSwaggerUI(options => + { + foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions) + + //foreach (var description in apiVersionDescriptionProvider) + { + options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", + description.GroupName.ToUpperInvariant()); + } + }); + + } + + + } +} diff --git a/src/HeartTrackAPI/Controllers/ActivityController.cs b/src/HeartTrackAPI/Controllers/ActivityController.cs index d20e167..76287f2 100644 --- a/src/HeartTrackAPI/Controllers/ActivityController.cs +++ b/src/HeartTrackAPI/Controllers/ActivityController.cs @@ -52,12 +52,20 @@ public class ActivityController : Controller return StatusCode(500); } } - /* + [HttpPost] - [ProducesResponseType(StatusCodes.Status201Created)] - [ProducesResponseType(StatusCodes.Status415UnsupportedMediaType)] - [MultipartFormData] - [DisableFormValueModelBinding] + public async Task PostActivity(ActivityDto activityDto) + { + var activity = activityDto.ToModel(); + var result = await _activityService.AddActivity(activity); + if (result == null) + { + return BadRequest(); + } + return CreatedAtAction(nameof(GetActivity), new { id = result.Id }, result.ToDto()); + } + + /* public async Task PostFitFile( Stream file, string contentType) // [FromForm] { if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType)) diff --git a/src/HeartTrackAPI/Program.cs b/src/HeartTrackAPI/Program.cs index 5ab0c66..90e1b5a 100644 --- a/src/HeartTrackAPI/Program.cs +++ b/src/HeartTrackAPI/Program.cs @@ -1,174 +1,23 @@ -using System.Reflection; using DbContextLib; -using DbContextLib.Identity; using HeartTrackAPI; -using HeartTrackAPI.Utils; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc.ApiExplorer; -using Microsoft.AspNetCore.Mvc.Versioning; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; -using Microsoft.OpenApi.Models; -using Model.Manager; -using Model2Entities; -using Swashbuckle.AspNetCore.SwaggerGen; +using StubbedContextLib; var builder = WebApplication.CreateBuilder(args); builder.Logging.AddConsole(); -builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.Limits.MaxRequestBodySize = long.MaxValue; }); - - -builder.Services.AddControllers(); -builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(options => -{ - options.OperationFilter(); - - var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; - var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - options.IncludeXmlComments(xmlPath); - - options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme - { - Description = - "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", - Name = "Authorization", - In = ParameterLocation.Header, - Type = SecuritySchemeType.ApiKey - }); - var scheme = new OpenApiSecurityRequirement - { - { - new OpenApiSecurityScheme - { - Reference = new OpenApiReference - { - Type = ReferenceType.SecurityScheme, - Id = "Bearer" - }, - Scheme = "oauth2", - Name = "Bearer", - In = ParameterLocation.Header, - }, - new List() - } - }; - options.AddSecurityRequirement(scheme); -}); -builder.Services.AddTransient, SwaggerOptions>(); -builder.Services.AddSwaggerGen(options => { options.OperationFilter(); }); -/* services.AddSwaggerGen(options => - { - options.SwaggerDoc("v1", new OpenApiInfo { Title = "HeartTrackAPI", Version = "v1" }); - options.SwaggerDoc("v2", new OpenApiInfo { Title = "HeartTrackAPI", Version = "v2" }); - });*/ - -builder.Services.AddVersionedApiExplorer(setup => +builder.WebHost.ConfigureKestrel(serverOptions => { - setup.GroupNameFormat = "'v'VVV"; - setup.SubstituteApiVersionInUrl = true; + serverOptions.Limits.MaxRequestBodySize = long.MaxValue; }); -string connectionString; - -switch (Environment.GetEnvironmentVariable("TYPE")) -{ - case "BDD": - var HOST = System.Environment.GetEnvironmentVariable("HOST"); - var PORT = System.Environment.GetEnvironmentVariable("PORTDB"); - var DATABASE = System.Environment.GetEnvironmentVariable("DATABASE"); - var USERNAME = System.Environment.GetEnvironmentVariable("USERNAME"); - var PASSWORD = System.Environment.GetEnvironmentVariable("PASSWORD"); - - connectionString = $"Server={HOST};port={PORT};database={DATABASE};user={USERNAME};password={PASSWORD}"; - Console.WriteLine("========RUNNING USING THE MYSQL SERVER=============="); - Console.WriteLine(connectionString); - Console.WriteLine(connectionString); - Console.WriteLine("======================"); - // with auth when it was working was'nt here - builder.Services.AddDbContext(options => options.UseInMemoryDatabase("AuthDb")); - builder.Services.AddDbContext(options => - options.UseMySql($"{connectionString}", new MySqlServerVersion(new Version(10, 11, 1))) - , ServiceLifetime.Singleton); - break; - default: - Console.WriteLine("====== RUNNING USING THE IN SQLLITE DATABASE ======"); - connectionString = builder.Configuration.GetConnectionString("HeartTrackAuthConnection"); - if (!string.IsNullOrWhiteSpace(connectionString)) - { - builder.Services.AddDbContext(options => options.UseInMemoryDatabase("AuthDb")); - Console.WriteLine(connectionString); - Console.WriteLine("======================"); - //options => options.UseSqlite(connectionString) - //services.AddDbContext(); - builder.Services.AddDbContext(options => - options.UseSqlite(connectionString), ServiceLifetime.Singleton); - } - else - { - builder.Services.AddDbContext(options => options.UseInMemoryDatabase("AuthDb")); - builder.Services.AddDbContext(options => options.UseInMemoryDatabase("HeartTrackDb")); - } - - break; -} - -// app.Services.GetService()!.Database.EnsureCreated(); - -builder.Services.AddSingleton(provider => -{ - provider.GetRequiredService().Database.EnsureCreated(); - return new DbDataManager(provider.GetRequiredService()); -}); -builder.Services.AddAuthorization(); - -builder.Services.AddIdentityApiEndpoints() - .AddEntityFrameworkStores(); - -builder.Services.AddApiVersioning(opt => -{ - opt.ReportApiVersions = true; - opt.AssumeDefaultVersionWhenUnspecified = true; - opt.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0); -// options.ApiVersionReader = new HeaderApiVersionReader("api-version"); - - opt.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(), - new HeaderApiVersionReader("x-api-version"), - new MediaTypeApiVersionReader("x-api-version")); -}); - -builder.Services.AddHealthChecks(); +var init = new AppBootstrap(builder.Configuration); +init.ConfigureServices(builder.Services); var app = builder.Build(); -app.UseHttpsRedirection(); -app.MapIdentityApi(); - -app.MapControllers(); -app.UseAuthorization(); - -app.MapHealthChecks("/health"); - -// Configure the HTTP request pipeline. -if (true) -{ - var apiVersionDescriptionProvider = app.Services.GetRequiredService(); - app.UseSwagger(); - app.UseSwaggerUI(); - app.MapSwagger(); - app.UseSwaggerUI(options => - { - foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions) - - //foreach (var description in apiVersionDescriptionProvider) - { - options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", - description.GroupName.ToUpperInvariant()); - } - }); -} - +init.Configure(app, app.Environment); +var context = app.Services.GetService() ?? app.Services.GetService(); +context!.Database.EnsureCreated(); app.Run(); \ No newline at end of file