docs: add XML documentation and ConfigManager implementation plans

Add comprehensive XML documentation (param/returns tags) across 132 source
files to improve IntelliSense and API discoverability. Include ConfigManager
design documents and implementation plans for phases 1-9.
This commit is contained in:
Joseph Doherty
2026-01-20 02:26:26 -05:00
parent c044337539
commit d49330e697
136 changed files with 9181 additions and 4 deletions
@@ -28,6 +28,12 @@ public class AuthController : ApiControllerBase
private readonly IRsaKeyService _rsaKeyService;
private readonly ILogger<AuthController> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="AuthController"/> class.
/// </summary>
/// <param name="authService">The authentication service.</param>
/// <param name="rsaKeyService">The RSA key service for credential encryption.</param>
/// <param name="logger">Logger instance.</param>
public AuthController(
IAuthService authService,
IRsaKeyService rsaKeyService,
@@ -14,6 +14,8 @@ public partial class FileIOController
/// <summary>
/// Uploads an Excel file containing component lot/item pairs and returns the matched lots
/// </summary>
/// <param name="file">The Excel file containing component lot/item pairs.</param>
/// <param name="ct">The cancellation token.</param>
[HttpPost("componentlots/upload")]
[ProducesResponseType(typeof(FileUploadResult<LotViewModel>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(FileUploadResult<LotViewModel>), StatusCodes.Status400BadRequest)]
@@ -63,6 +65,7 @@ public partial class FileIOController
/// <summary>
/// Downloads an Excel template with current component lot data
/// </summary>
/// <param name="lotNumbers">The list of lot view models to include in the export.</param>
[HttpPost("componentlots/download")]
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
public IActionResult DownloadComponentLots([FromBody] List<LotViewModel>? lotNumbers)
@@ -14,6 +14,8 @@ public partial class FileIOController
/// <summary>
/// Uploads an Excel file containing item numbers and returns the matched items
/// </summary>
/// <param name="file">The uploaded Excel file containing item numbers.</param>
/// <param name="ct">The cancellation token.</param>
[HttpPost("items/upload")]
[ProducesResponseType(typeof(FileUploadResult<ItemViewModel>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(FileUploadResult<ItemViewModel>), StatusCodes.Status400BadRequest)]
@@ -62,6 +64,7 @@ public partial class FileIOController
/// <summary>
/// Downloads an Excel template with current item data
/// </summary>
/// <param name="items">The list of items to include in the template.</param>
[HttpPost("items/download")]
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
public IActionResult DownloadItems([FromBody] List<ItemViewModel>? items)
@@ -14,6 +14,8 @@ public partial class FileIOController
/// <summary>
/// Uploads an Excel file containing part operations and returns the parsed data
/// </summary>
/// <param name="file">The Excel file to upload.</param>
/// <returns>Result containing parsed part operations.</returns>
[HttpPost("partoperations/upload")]
[ProducesResponseType(typeof(FileUploadResult<PartOperationViewModel>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(FileUploadResult<PartOperationViewModel>), StatusCodes.Status400BadRequest)]
@@ -54,6 +56,8 @@ public partial class FileIOController
/// <summary>
/// Downloads an Excel template with current part operation data
/// </summary>
/// <param name="partOperations">Optional list of part operations to include in template.</param>
/// <returns>Excel file.</returns>
[HttpPost("partoperations/download")]
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
public IActionResult DownloadPartOperations([FromBody] List<PartOperationViewModel>? partOperations)
@@ -14,6 +14,9 @@ public partial class FileIOController
/// <summary>
/// Uploads an Excel file containing work order numbers and returns the matched work orders
/// </summary>
/// <param name="file">The Excel file to upload.</param>
/// <param name="ct">Cancellation token.</param>
/// <returns>Result containing parsed work orders.</returns>
[HttpPost("workorders/upload")]
[ProducesResponseType(typeof(FileUploadResult<WorkOrderViewModel>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(FileUploadResult<WorkOrderViewModel>), StatusCodes.Status400BadRequest)]
@@ -63,6 +66,8 @@ public partial class FileIOController
/// <summary>
/// Downloads an Excel template with current work order data
/// </summary>
/// <param name="workOrders">Optional list of work order numbers to include in template.</param>
/// <returns>Excel file.</returns>
[HttpPost("workorders/download")]
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
public IActionResult DownloadWorkOrders([FromBody] List<long>? workOrders)
@@ -21,6 +21,13 @@ public partial class FileIOController : ApiControllerBase
private readonly IExcelTemplateService _templateService;
private readonly ILogger<FileIOController> _logger;
/// <summary>
/// Initializes a new instance of the FileIOController class.
/// </summary>
/// <param name="repository">Repository for accessing lot finder data.</param>
/// <param name="parserService">Service for parsing Excel files.</param>
/// <param name="templateService">Service for generating Excel templates.</param>
/// <param name="logger">Logger for controller operations.</param>
public FileIOController(
ILotFinderRepository repository,
IExcelParserService parserService,
@@ -15,6 +15,10 @@ public class LookupController : ApiControllerBase
{
private readonly ILotFinderRepository _repository;
/// <summary>
/// Initializes a new instance of the <see cref="LookupController"/> class.
/// </summary>
/// <param name="repository">The LotFinder repository for data access.</param>
public LookupController(ILotFinderRepository repository)
{
_repository = repository;
@@ -20,6 +20,12 @@ public class PipelineController : ApiControllerBase
private readonly IDataUpdateRepository _dataUpdateRepository;
private readonly IPipelineMapper _mapper;
/// <summary>
/// Initializes a new instance of the <see cref="PipelineController"/> class.
/// </summary>
/// <param name="pipelineFactory">The ETL pipeline factory.</param>
/// <param name="dataUpdateRepository">The data update repository.</param>
/// <param name="mapper">The pipeline mapper.</param>
public PipelineController(
IEtlPipelineFactory pipelineFactory,
IDataUpdateRepository dataUpdateRepository,
@@ -45,6 +51,7 @@ public class PipelineController : ApiControllerBase
/// <summary>
/// Gets configuration for a specific pipeline.
/// </summary>
/// <param name="name">The pipeline name.</param>
[HttpGet(ApiRoutes.Pipelines.ByName)]
public ActionResult<PipelineConfigDto> GetPipeline(string name)
{
@@ -60,6 +67,8 @@ public class PipelineController : ApiControllerBase
/// <summary>
/// Gets schedule status for a pipeline.
/// </summary>
/// <param name="name">The pipeline name.</param>
/// <param name="cancellationToken">The cancellation token.</param>
[HttpGet(ApiRoutes.Pipelines.Status)]
public async Task<ActionResult<PipelineStatusResponse>> GetStatus(
string name,
@@ -104,6 +113,9 @@ public class PipelineController : ApiControllerBase
/// <summary>
/// Gets recent execution history for a pipeline.
/// </summary>
/// <param name="name">The pipeline name.</param>
/// <param name="count">The maximum number of recent executions to retrieve.</param>
/// <param name="cancellationToken">The cancellation token.</param>
[HttpGet(ApiRoutes.Pipelines.Executions)]
public async Task<ActionResult<PipelineExecutionsResponse>> GetExecutions(
string name,
@@ -17,6 +17,10 @@ public class RefreshStatusController : ApiControllerBase
{
private readonly ILotFinderRepository _repository;
/// <summary>
/// Initializes a new instance of the <see cref="RefreshStatusController"/> class.
/// </summary>
/// <param name="repository">The repository for accessing data update records.</param>
public RefreshStatusController(ILotFinderRepository repository)
{
_repository = repository;
@@ -26,6 +26,13 @@ public class SearchController : ApiControllerBase
private readonly ILogger<SearchController> _logger;
private readonly TimeProvider _timeProvider;
/// <summary>
/// Initializes a new instance of the SearchController.
/// </summary>
/// <param name="repository">The lot finder repository for data access.</param>
/// <param name="hubContext">The SignalR hub context for sending search updates.</param>
/// <param name="logger">The logger for recording search operations.</param>
/// <param name="timeProvider">The time provider for generating timestamps.</param>
public SearchController(
ILotFinderRepository repository,
IHubContext<StatusHub> hubContext,
@@ -41,6 +48,7 @@ public class SearchController : ApiControllerBase
/// <summary>
/// Gets all searches for the current user
/// </summary>
/// <param name="ct">The cancellation token.</param>
[HttpGet]
[ProducesResponseType(typeof(IEnumerable<SearchViewModel>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
@@ -59,6 +67,7 @@ public class SearchController : ApiControllerBase
/// <summary>
/// Gets all queued searches
/// </summary>
/// <param name="ct">The cancellation token.</param>
[HttpGet("queue")]
[ProducesResponseType(typeof(IEnumerable<SearchViewModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<IEnumerable<SearchViewModel>>> GetQueuedSearches(CancellationToken ct)
@@ -71,6 +80,8 @@ public class SearchController : ApiControllerBase
/// <summary>
/// Gets a single search by ID
/// </summary>
/// <param name="id">The search identifier.</param>
/// <param name="ct">The cancellation token.</param>
[HttpGet("{id:int}")]
[ProducesResponseType(typeof(SearchViewModel), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
@@ -87,6 +98,8 @@ public class SearchController : ApiControllerBase
/// <summary>
/// Copies an existing search for the current user (returns copy without persisting)
/// </summary>
/// <param name="id">The search identifier to copy.</param>
/// <param name="ct">The cancellation token.</param>
[HttpGet("{id:int}/copy")]
[ProducesResponseType(typeof(SearchViewModel), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
@@ -121,6 +134,8 @@ public class SearchController : ApiControllerBase
/// <summary>
/// Creates a new search
/// </summary>
/// <param name="viewModel">The search view model containing criteria and name.</param>
/// <param name="ct">The cancellation token.</param>
[HttpPost]
[ProducesResponseType(typeof(int), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
@@ -160,6 +175,8 @@ public class SearchController : ApiControllerBase
/// <summary>
/// Downloads search results as an Excel file
/// </summary>
/// <param name="id">The search identifier.</param>
/// <param name="ct">The cancellation token.</param>
[HttpGet("{id:int}/results")]
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
+6
View File
@@ -16,6 +16,12 @@ public class StatusHub : Hub
private readonly ILogger<StatusHub> _logger;
private readonly TimeProvider _timeProvider;
/// <summary>
/// Initializes a new instance of the <see cref="StatusHub"/> class.
/// </summary>
/// <param name="cache">The memory cache for caching status updates.</param>
/// <param name="logger">The logger instance.</param>
/// <param name="timeProvider">The time provider for getting current UTC time.</param>
public StatusHub(IMemoryCache cache, ILogger<StatusHub> logger, TimeProvider timeProvider)
{
_cache = cache;
@@ -12,15 +12,23 @@ public interface IPipelineMapper
/// <summary>
/// Maps a pipeline configuration to its DTO representation.
/// </summary>
/// <param name="name">The pipeline name.</param>
/// <param name="config">The pipeline configuration.</param>
/// <param name="defaults">The default schedule settings.</param>
PipelineConfigDto MapToDto(string name, PipelineConfig config, ScheduleDefaults defaults);
/// <summary>
/// Gets the effective interval for a schedule, applying defaults if not specified.
/// </summary>
/// <param name="config">The schedule configuration, or null to use defaults.</param>
/// <param name="defaults">The default schedule settings.</param>
/// <param name="updateType">The type of update to get the interval for.</param>
int GetEffectiveInterval(ScheduleConfig? config, ScheduleDefaults defaults, UpdateTypes updateType);
/// <summary>
/// Gets the schedule configuration for a specific update type.
/// </summary>
/// <param name="config">The pipeline configuration.</param>
/// <param name="updateType">The type of update to get the configuration for.</param>
ScheduleConfig? GetScheduleConfig(PipelineConfig config, UpdateTypes updateType);
}