diff --git a/devdocs/todo.txt b/devdocs/todo.txt index 9afa5dce..6188b8ea 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -17,7 +17,12 @@ Need to consider re-thinking versioning system of api to remove the complexity o Test out versioning in the test project I made following the Swashbuckle guide for multiple docs: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#list-multiple-swagger-documents -Because maybe this is the way to go? + +- Update my code to the modern standard: https://kimsereyblog.blogspot.com/2018/08/apicontroller-attribute-in-asp-net-core.html +- Note that that above is for v2.2 my controllers appear to date from the v1 .net core era and I will need to then move them to the .netcore 3.1 era changes + - This is important and worth doing to make sure everything will work going forward (the swashbuckle [apicontroller] attribute debacle is proof of this) + + Need a sprint to get to a fully testable client with entry form, list and as much as possible all features from COMMON-* specs list diff --git a/docs/8.0/ayanova/docs/api-console.md b/docs/8.0/ayanova/docs/api-console.md index e7c9b25d..009fefb4 100644 --- a/docs/8.0/ayanova/docs/api-console.md +++ b/docs/8.0/ayanova/docs/api-console.md @@ -28,9 +28,9 @@ The "response body" section will contain the return value, something similar to The highlighted line above contains the token you require, copy the token value not including the quotation marks. This is your access token. -Click on the "Authorize" button at the top of the API console and a popup dialog box will open. In the "Value" box the dialog enter the word Bearer followed by a space and then your api token, for example using the above you would paste in: +Click on the "Authorize" button at the top of the API console and a popup dialog box will open. In the "Value" box the dialog enter your api token, for example using the above you would paste in: -`Bearer xyGhbGciOiJIUzI1NiIsInR4cCI6IkpXVCJ9.utJpYXQ4OiIxNqE4MDM0MzcfIiwiZXhwjjoiMTUyMDYyNjM8MCIsImlocyI0IkF53U5vdmEiLCJpZCI6IjEifQ.z7QaHKt2VbcysunIvsfa-51X7owB1EYcyhpkdkfaqzy` +`xyGhbGciOiJIUzI1NiIsInR4cCI6IkpXVCJ9.utJpYXQ4OiIxNqE4MDM0MzcfIiwiZXhwjjoiMTUyMDYyNjM8MCIsImlocyI0IkF53U5vdmEiLCJpZCI6IjEifQ.z7QaHKt2VbcysunIvsfa-51X7owB1EYcyhpkdkfaqzy` then click on the "Authorize" button inside the popup dialog box. diff --git a/server/AyaNova/Controllers/AttachmentController.cs b/server/AyaNova/Controllers/AttachmentController.cs index 60cc2998..989a7135 100644 --- a/server/AyaNova/Controllers/AttachmentController.cs +++ b/server/AyaNova/Controllers/AttachmentController.cs @@ -32,11 +32,12 @@ namespace AyaNova.Api.Controllers /// /// Attachment controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class AttachmentController : Controller + public class AttachmentController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/AuthController.cs b/server/AyaNova/Controllers/AuthController.cs index 7572f3c6..86347041 100644 --- a/server/AyaNova/Controllers/AuthController.cs +++ b/server/AyaNova/Controllers/AuthController.cs @@ -19,10 +19,11 @@ namespace AyaNova.Api.Controllers /// /// Authentication controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] - public class AuthController : Controller + public class AuthController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/AyaEnumPickListController.cs b/server/AyaNova/Controllers/AyaEnumPickListController.cs index cd4a285b..3cf269cd 100644 --- a/server/AyaNova/Controllers/AyaEnumPickListController.cs +++ b/server/AyaNova/Controllers/AyaEnumPickListController.cs @@ -15,11 +15,12 @@ namespace AyaNova.Api.Controllers /// /// Enum pick list controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class AyaEnumPickListController : Controller + public class AyaEnumPickListController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/AyaTypeController.cs b/server/AyaNova/Controllers/AyaTypeController.cs index 3c5fdb73..c5a4159f 100644 --- a/server/AyaNova/Controllers/AyaTypeController.cs +++ b/server/AyaNova/Controllers/AyaTypeController.cs @@ -15,11 +15,12 @@ namespace AyaNova.Api.Controllers /// /// AyaType list controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class AyaTypeController : Controller + public class AyaTypeController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/BackupController.cs b/server/AyaNova/Controllers/BackupController.cs index 90b4f20e..9638b98f 100644 --- a/server/AyaNova/Controllers/BackupController.cs +++ b/server/AyaNova/Controllers/BackupController.cs @@ -1,24 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Logging; using AyaNova.Models; using AyaNova.Api.ControllerHelpers; -using AyaNova.Util; - -using System.Globalization; -using System.IO; -using System.Text; -using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Mvc.ModelBinding; -using Microsoft.AspNetCore.WebUtilities; -using Microsoft.Net.Http.Headers; - -using System.Collections.Generic; -using System.Linq; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -34,7 +19,7 @@ using System.Linq; namespace AyaNova.Api.Controllers { - + //FROM DOCS HERE: //https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads#uploading-large-files-with-streaming @@ -46,11 +31,12 @@ namespace AyaNova.Api.Controllers /// and triggering a restore from backup /// /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class BackupController : Controller + public class BackupController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/DataFilterController.cs b/server/AyaNova/Controllers/DataFilterController.cs index f549bdc9..1bb6b6d8 100644 --- a/server/AyaNova/Controllers/DataFilterController.cs +++ b/server/AyaNova/Controllers/DataFilterController.cs @@ -19,11 +19,12 @@ namespace AyaNova.Api.Controllers /// /// /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class DataFilterController : Controller + public class DataFilterController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/EventLogController.cs b/server/AyaNova/Controllers/EventLogController.cs index f9ae1117..3c6ecdf2 100644 --- a/server/AyaNova/Controllers/EventLogController.cs +++ b/server/AyaNova/Controllers/EventLogController.cs @@ -19,10 +19,11 @@ namespace AyaNova.Api.Controllers /// /// Log files controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Authorize] - public class EventLogController : Controller + public class EventLogController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/FormCustomController.cs b/server/AyaNova/Controllers/FormCustomController.cs index 1e621e3f..9a2e17b4 100644 --- a/server/AyaNova/Controllers/FormCustomController.cs +++ b/server/AyaNova/Controllers/FormCustomController.cs @@ -18,12 +18,13 @@ namespace AyaNova.Api.Controllers /// /// - /// + /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class FormCustomController : Controller + public class FormCustomController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/ImportAyaNova7Controller.cs b/server/AyaNova/Controllers/ImportAyaNova7Controller.cs index be990765..eafc2be2 100644 --- a/server/AyaNova/Controllers/ImportAyaNova7Controller.cs +++ b/server/AyaNova/Controllers/ImportAyaNova7Controller.cs @@ -28,12 +28,13 @@ namespace AyaNova.Api.Controllers /// /// Import AyaNova 7 data controller - /// + /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class ImportAyaNova7Controller : Controller + public class ImportAyaNova7Controller : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/JobOperationsController.cs b/server/AyaNova/Controllers/JobOperationsController.cs index 4dd8b621..fa1595fe 100644 --- a/server/AyaNova/Controllers/JobOperationsController.cs +++ b/server/AyaNova/Controllers/JobOperationsController.cs @@ -17,11 +17,12 @@ namespace AyaNova.Api.Controllers /// /// JobOperations controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class JobOperationsController : Controller + public class JobOperationsController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/LicenseController.cs b/server/AyaNova/Controllers/LicenseController.cs index 811ae95c..1afe5f96 100644 --- a/server/AyaNova/Controllers/LicenseController.cs +++ b/server/AyaNova/Controllers/LicenseController.cs @@ -15,12 +15,13 @@ namespace AyaNova.Api.Controllers /// /// License route - /// + /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class LicenseController : Controller + public class LicenseController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/LocaleController.cs b/server/AyaNova/Controllers/LocaleController.cs index 43f3306e..c0768c34 100644 --- a/server/AyaNova/Controllers/LocaleController.cs +++ b/server/AyaNova/Controllers/LocaleController.cs @@ -23,11 +23,12 @@ namespace AyaNova.Api.Controllers /// /// Localized text controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class LocaleController : Controller + public class LocaleController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/LogFilesController.cs b/server/AyaNova/Controllers/LogFilesController.cs index 71d19716..0430e39b 100644 --- a/server/AyaNova/Controllers/LogFilesController.cs +++ b/server/AyaNova/Controllers/LogFilesController.cs @@ -16,11 +16,12 @@ namespace AyaNova.Api.Controllers /// /// Log files controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] //[Produces("application/json")] [Authorize] - public class LogFilesController : Controller + public class LogFilesController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/MetricsController.cs b/server/AyaNova/Controllers/MetricsController.cs index e1f87d2d..aee2bfd9 100644 --- a/server/AyaNova/Controllers/MetricsController.cs +++ b/server/AyaNova/Controllers/MetricsController.cs @@ -18,10 +18,11 @@ namespace AyaNova.Api.Controllers /// /// Log files controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Authorize] - public class MetricsController : Controller + public class MetricsController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/SearchController.cs b/server/AyaNova/Controllers/SearchController.cs index f991e561..773ba608 100644 --- a/server/AyaNova/Controllers/SearchController.cs +++ b/server/AyaNova/Controllers/SearchController.cs @@ -19,11 +19,12 @@ namespace AyaNova.Api.Controllers /// /// Search /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class SearchController : Controller + public class SearchController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/ServerStateController.cs b/server/AyaNova/Controllers/ServerStateController.cs index ced534cc..fcebc552 100644 --- a/server/AyaNova/Controllers/ServerStateController.cs +++ b/server/AyaNova/Controllers/ServerStateController.cs @@ -15,10 +15,11 @@ namespace AyaNova.Api.Controllers /// /// Server state controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] - public class ServerStateController : Controller + public class ServerStateController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/TagListController.cs b/server/AyaNova/Controllers/TagListController.cs index 07255035..651419e6 100644 --- a/server/AyaNova/Controllers/TagListController.cs +++ b/server/AyaNova/Controllers/TagListController.cs @@ -15,11 +15,12 @@ namespace AyaNova.Api.Controllers /// /// Enum pick list controller /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class TagListController : Controller + public class TagListController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/TrialController.cs b/server/AyaNova/Controllers/TrialController.cs index e8cc9906..529cd424 100644 --- a/server/AyaNova/Controllers/TrialController.cs +++ b/server/AyaNova/Controllers/TrialController.cs @@ -13,11 +13,12 @@ namespace AyaNova.Api.Controllers /// ///Test controller class used during development /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class TrialController : Controller + public class TrialController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/UserController.cs b/server/AyaNova/Controllers/UserController.cs index 5f9ada8d..ed5920a4 100644 --- a/server/AyaNova/Controllers/UserController.cs +++ b/server/AyaNova/Controllers/UserController.cs @@ -19,11 +19,12 @@ namespace AyaNova.Api.Controllers /// /// User /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class UserController : Controller + public class UserController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/UserOptionsController.cs b/server/AyaNova/Controllers/UserOptionsController.cs index 10285549..b0bd47fc 100644 --- a/server/AyaNova/Controllers/UserOptionsController.cs +++ b/server/AyaNova/Controllers/UserOptionsController.cs @@ -19,11 +19,12 @@ namespace AyaNova.Api.Controllers /// /// UserOptions /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class UserOptionsController : Controller + public class UserOptionsController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Controllers/WidgetController.cs b/server/AyaNova/Controllers/WidgetController.cs index 80619579..79ec3bec 100644 --- a/server/AyaNova/Controllers/WidgetController.cs +++ b/server/AyaNova/Controllers/WidgetController.cs @@ -22,11 +22,12 @@ namespace AyaNova.Api.Controllers /// /// Sample controller class used during development for testing purposes /// + [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class WidgetController : Controller + public class WidgetController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; diff --git a/server/AyaNova/Startup.cs b/server/AyaNova/Startup.cs index 503ea180..4c1ac045 100644 --- a/server/AyaNova/Startup.cs +++ b/server/AyaNova/Startup.cs @@ -149,23 +149,30 @@ namespace AyaNova + // Add service and create Policy with options + _log.LogDebug("BOOT: init CORS service"); + services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader() + //.AllowCredentials() + ); + }); #region Swagger - // services - // .AddApiVersioning(options => - // { - // options.AssumeDefaultVersionWhenUnspecified = true; - // options.DefaultApiVersion = Microsoft.AspNetCore.Mvc.ApiVersion.Parse("8.0"); - // options.ReportApiVersions = true; - // }); - - // services.AddVersionedApiExplorer(o => o.GroupNameFormat = "'v'VVV"); - - services.AddApiVersioning(); + services + .AddApiVersioning(options => + { + options.AssumeDefaultVersionWhenUnspecified = true; + options.DefaultApiVersion = Microsoft.AspNetCore.Mvc.ApiVersion.Parse("8.0"); + options.ReportApiVersions = true; + }); services.AddVersionedApiExplorer(options => options.GroupNameFormat = "'v'VVV"); // services.AddSwaggerGen( @@ -184,8 +191,32 @@ namespace AyaNova // return versions.Any(v => $"v{v.ToString()}" == docName); // }); // }); - services.AddTransient, ConfigureSwaggerOptions>(); - services.AddSwaggerGen(); + services.AddTransient, ConfigureSwaggerOptions>(); + services.AddSwaggerGen( + c=>{ + + //https://stackoverflow.com/questions/56234504/migrating-to-swashbuckle-aspnetcore-version-5 + //First we define the security scheme + c.AddSecurityDefinition("Bearer", //Name the security scheme + new OpenApiSecurityScheme + { + Description = "JWT Authorization header using the Bearer scheme.", + Type = SecuritySchemeType.Http, //We set the scheme type to http since we're using bearer authentication + Scheme = "bearer" //The name of the HTTP Authorization scheme to be used in the Authorization header. In this case "bearer". + }); + + c.AddSecurityRequirement(new OpenApiSecurityRequirement{ + { + new OpenApiSecurityScheme{ + Reference = new OpenApiReference{ + Id = "Bearer", //The name of the previously defined security scheme. + Type = ReferenceType.SecurityScheme + } + },new List() + } + }); + } + ); #endregion @@ -349,30 +380,8 @@ namespace AyaNova #region SWAGGER _log.LogDebug("BOOT: pipeline - api explorer"); - // Enable middleware to serve generated Swagger as a JSON endpoint. - // app.UseSwagger(); - - // app.UseSwaggerUI(c => - // { - // // build a swagger endpoint for each discovered API version - // foreach (var description in provider.ApiVersionDescriptions) - // { - // c.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); - // } - - // //clean up the swagger explorer UI page and remove the branding - // //via our own css - // //NOTE: this broke when updated to v2.x of swagger and it can be fixed according to docs: - // //https://github.com/domaindrivendev/Swashbuckle.AspNetCore#inject-custom-css - // // c.InjectStylesheet("/api/sw.css"); - - // c.DefaultModelsExpandDepth(-1); - // c.DocumentTitle = "AyaNova API explorer"; - // c.RoutePrefix = "api-docs"; - // }); - - app.UseSwagger(); - + // Enable middleware to serve generated Swagger as a JSON endpoint. + app.UseSwagger(); app.UseSwaggerUI( options => { @@ -382,8 +391,9 @@ namespace AyaNova $"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); } + options.DefaultModelsExpandDepth(-1);//This is meant to hide the Models section that would appear at the bottom of the swagger ui showing *all* models from the api options.DocumentTitle = "AyaNova API explorer"; - options.RoutePrefix = "api-docs"; + options.RoutePrefix = "api-docs"; });