Files
jdescopingtool/openspec/changes/archive/2026-01-01-implement-data-access/tasks.md
T
Joseph Doherty 26ff8d9b4f Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
2026-01-02 07:43:29 -05:00

9.4 KiB

Tasks: Implement Data Access

Phase 1: Project Setup

  • Create JdeScoping.DataAccess project

    • Location: NEW/src/JdeScoping.DataAccess/JdeScoping.DataAccess.csproj
    • Target: net10.0
    • Validation: Project builds successfully
    • Dependencies: None
  • Add NuGet package references

    • Packages: Microsoft.Data.SqlClient, Oracle.ManagedDataAccess.Core, Dapper, Microsoft.Extensions.Options, Microsoft.Extensions.Logging.Abstractions, Microsoft.Extensions.Configuration.Abstractions
    • Validation: dotnet restore succeeds
  • Create folder structure

    • Folders: Exceptions/, Interfaces/, Repositories/, Queries/, Configuration/
    • Validation: Directories exist

Phase 2: Exception Types

  • Create DataAccessException base class

    • Location: Exceptions/DataAccessException.cs
    • Properties: Operation, Repository, Message, InnerException
    • Validation: Class compiles
  • Create ConnectionException class

    • Location: Exceptions/ConnectionException.cs
    • Properties: DataSource (inherits from DataAccessException)
    • Validation: Class compiles
  • Create QueryException class

    • Location: Exceptions/QueryException.cs
    • Properties: QueryName (inherits from DataAccessException)
    • Validation: Class compiles
  • Create DataAccessTimeoutException class

    • Location: Exceptions/DataAccessTimeoutException.cs
    • Properties: TimeoutSeconds (inherits from DataAccessException)
    • Validation: Class compiles

Phase 3: Configuration

  • Create DataAccessOptions class
    • Location: Configuration/DataAccessOptions.cs
    • Properties: DefaultTimeoutSeconds, LotUsageTimeoutSeconds, MisDataTimeoutSeconds, RebuildIndexTimeoutSeconds, ProductionSchema, ArchiveSchema, StageSchema
    • Validation: Class compiles with default values

Phase 4: Connection Factory

  • Create IDbConnectionFactory interface

    • Location: Interfaces/IDbConnectionFactory.cs
    • Methods: CreateLotFinderConnectionAsync, CreateJdeConnectionAsync, CreateJdeStageConnectionAsync, CreateCmsConnectionAsync
    • Validation: Interface compiles
  • Create DbConnectionFactory implementation

    • Location: DbConnectionFactory.cs
    • Dependencies: IConfiguration, ILogger
    • Validation: Compiles, logs connection attempts

Phase 5: SQL Query Constants

  • Create LotFinderQueries static class

    • Location: Queries/LotFinderQueries.cs
    • Contains: All SQL Server queries from spec (GetUserSearches, GetQueuedSearches, GetSearch, etc.)
    • Validation: All queries compile as const strings
  • Create JdeQueries static class

    • Location: Queries/JdeQueries.cs
    • Contains: All JDE Oracle queries from spec (GetWorkOrders, GetWorkOrderSteps, GetLots, etc.)
    • Note: Include both full and filtered variants
    • Validation: All queries compile as const strings
  • Create CmsQueries static class

    • Location: Queries/CmsQueries.cs
    • Contains: SQL_GET_MIS_DATA query from spec
    • Validation: Query compiles as const string

Phase 6: Repository Interfaces

  • Create ILotFinderRepository interface

    • Location: Interfaces/ILotFinderRepository.cs
    • Methods: All 17 methods from spec (GetUserSearchesAsync, GetQueuedSearchesAsync, GetSearchAsync, GetSearchResultsAsync, SubmitSearchAsync, UpdateSearchStatusAsync, UpdateSearchResultsAsync, SearchItemsAsync, LookupItemsAsync, LookupWorkordersAsync, SearchWorkCentersAsync, LookupWorkCentersAsync, SearchProfitCentersAsync, LookupProfitCentersAsync, SearchUsersAsync, LookupUsersAsync, LookupLotsAsync, GetLastDataUpdatesAsync, GetTableSpecAsync, RebuildIndicesAsync, PostProcessMisDataAsync, BulkInsertAsync, TruncateTableAsync)
    • Validation: Interface compiles
  • Create IJdeRepository interface

    • Location: Interfaces/IJdeRepository.cs
    • Methods: All 18 methods from spec (GetWorkOrdersAsync, GetWorkOrdersArchiveAsync, GetWorkOrderStepsAsync, GetWorkOrderStepsArchiveAsync, GetWorkOrderTimesAsync, GetWorkOrderTimesArchiveAsync, GetWorkOrderRoutingsAsync, GetWorkOrderComponentsAsync, GetWorkOrderComponentsArchiveAsync, GetLotsAsync, GetLotUsagesAsync, GetLotUsagesArchiveAsync, GetLotLocationsAsync, GetItemsAsync, GetUsersAsync, GetBranchesAsync, GetProfitCentersAsync, GetWorkCentersAsync, GetStatusCodesAsync, GetFunctionCodesAsync, GetOrgHierarchyAsync, GetRouteMastersAsync)
    • Return types: IAsyncEnumerable for streaming
    • Validation: Interface compiles
  • Create ICmsRepository interface

    • Location: Interfaces/ICmsRepository.cs
    • Methods: GetMisDataAsync
    • Return type: IAsyncEnumerable
    • Validation: Interface compiles

Phase 7: LotFinderRepository Implementation

  • Create LotFinderRepository class

    • Location: Repositories/LotFinderRepository.cs
    • Dependencies: IDbConnectionFactory, ILogger, IOptions
    • Validation: Class compiles
  • Implement Search Management methods

    • Methods: GetUserSearchesAsync, GetQueuedSearchesAsync, GetSearchAsync, GetSearchResultsAsync, SubmitSearchAsync, UpdateSearchStatusAsync, UpdateSearchResultsAsync
    • Validation: Methods compile, use Dapper QueryAsync/ExecuteAsync
  • Implement Reference Data Lookup methods

    • Methods: SearchItemsAsync, LookupItemsAsync, LookupWorkordersAsync, SearchWorkCentersAsync, LookupWorkCentersAsync, SearchProfitCentersAsync, LookupProfitCentersAsync, SearchUsersAsync, LookupUsersAsync, LookupLotsAsync
    • Note: Use DataTable for table-valued parameters
    • Validation: Methods compile
  • Implement Data Sync methods

    • Methods: GetLastDataUpdatesAsync, GetTableSpecAsync, RebuildIndicesAsync, PostProcessMisDataAsync, BulkInsertAsync, TruncateTableAsync
    • Note: RebuildIndicesAsync includes table name whitelist validation
    • Validation: Methods compile

Phase 8: JdeRepository Implementation

  • Create JdeRepository class

    • Location: Repositories/JdeRepository.cs
    • Dependencies: IDbConnectionFactory, ILogger, IOptions
    • Validation: Class compiles
  • Implement Work Order methods

    • Methods: GetWorkOrdersAsync, GetWorkOrdersArchiveAsync, GetWorkOrderStepsAsync, GetWorkOrderStepsArchiveAsync, GetWorkOrderTimesAsync, GetWorkOrderTimesArchiveAsync, GetWorkOrderRoutingsAsync, GetWorkOrderComponentsAsync, GetWorkOrderComponentsArchiveAsync
    • Pattern: IAsyncEnumerable with Query (buffered: false) for streaming
    • Validation: Methods compile
  • Implement Lot methods

    • Methods: GetLotsAsync, GetLotUsagesAsync, GetLotUsagesArchiveAsync, GetLotLocationsAsync
    • Note: GetLotLocationsAsync uses JDE Stage connection
    • Validation: Methods compile
  • Implement Reference Data methods

    • Methods: GetItemsAsync, GetUsersAsync, GetBranchesAsync, GetProfitCentersAsync, GetWorkCentersAsync, GetStatusCodesAsync, GetFunctionCodesAsync, GetOrgHierarchyAsync, GetRouteMastersAsync
    • Note: GetStatusCodesAsync uses JDE Stage connection
    • Validation: Methods compile
  • Implement schema placeholder replacement

    • Method: Private ApplySchemaReplacements method
    • Replaces: {ProductionSchema}, {ArchiveSchema}, {StageSchema}
    • Validation: Placeholders replaced correctly

Phase 9: CmsRepository Implementation

  • Create CmsRepository class

    • Location: Repositories/CmsRepository.cs
    • Dependencies: IDbConnectionFactory, ILogger, IOptions
    • Validation: Class compiles
  • Implement GetMisDataAsync method

    • Pattern: IAsyncEnumerable with Query (buffered: false) for streaming
    • Timeout: Uses MisDataTimeoutSeconds from options
    • Validation: Method compiles

Phase 10: Service Registration

  • Create ServiceCollectionExtensions class
    • Location: Extensions/ServiceCollectionExtensions.cs
    • Method: AddDataAccess(this IServiceCollection services, IConfiguration configuration)
    • Registers: DataAccessOptions, IDbConnectionFactory (singleton), all repositories (scoped)
    • Validation: Extension method compiles

Phase 11: Unit Tests

  • Create test project

    • Location: NEW/tests/JdeScoping.DataAccess.Tests/JdeScoping.DataAccess.Tests.csproj
    • Dependencies: xUnit, NSubstitute, Shouldly
    • Validation: Project builds
  • Create DbConnectionFactory tests

    • Tests: Connection creation, error handling, logging
    • Validation: Tests pass
  • Create LotFinderRepository tests

    • Tests: Search methods, lookup methods, exception handling
    • Mock: IDbConnectionFactory
    • Validation: Tests pass
  • Create JdeRepository tests

    • Tests: Streaming methods, cancellation, schema replacement
    • Mock: IDbConnectionFactory
    • Validation: Tests pass
  • Create CmsRepository tests

    • Tests: GetMisDataAsync, timeout configuration
    • Mock: IDbConnectionFactory
    • Validation: Tests pass

Phase 12: Verification

  • Build complete solution

    • Command: dotnet build NEW/JdeScoping.slnx
    • Validation: No build errors
  • Run all unit tests

    • Command: dotnet test NEW/tests/JdeScoping.DataAccess.Tests/
    • Validation: All 124 tests pass
  • Validate OpenSpec change

    • Command: openspec validate implement-data-access --strict
    • Validation: No validation errors
  • Codex MCP review

    • Review: Repository implementations against spec
    • Verify: All methods match spec signatures
    • Verify: Query SQL matches legacy exactly