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

209 lines
9.4 KiB
Markdown

# Tasks: Implement Data Access
## Phase 1: Project Setup
- [x] Create JdeScoping.DataAccess project
- Location: `NEW/src/JdeScoping.DataAccess/JdeScoping.DataAccess.csproj`
- Target: net10.0
- Validation: Project builds successfully
- Dependencies: None
- [x] 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
- [x] Create folder structure
- Folders: Exceptions/, Interfaces/, Repositories/, Queries/, Configuration/
- Validation: Directories exist
## Phase 2: Exception Types
- [x] Create DataAccessException base class
- Location: `Exceptions/DataAccessException.cs`
- Properties: Operation, Repository, Message, InnerException
- Validation: Class compiles
- [x] Create ConnectionException class
- Location: `Exceptions/ConnectionException.cs`
- Properties: DataSource (inherits from DataAccessException)
- Validation: Class compiles
- [x] Create QueryException class
- Location: `Exceptions/QueryException.cs`
- Properties: QueryName (inherits from DataAccessException)
- Validation: Class compiles
- [x] Create DataAccessTimeoutException class
- Location: `Exceptions/DataAccessTimeoutException.cs`
- Properties: TimeoutSeconds (inherits from DataAccessException)
- Validation: Class compiles
## Phase 3: Configuration
- [x] 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
- [x] Create IDbConnectionFactory interface
- Location: `Interfaces/IDbConnectionFactory.cs`
- Methods: CreateLotFinderConnectionAsync, CreateJdeConnectionAsync, CreateJdeStageConnectionAsync, CreateCmsConnectionAsync
- Validation: Interface compiles
- [x] Create DbConnectionFactory implementation
- Location: `DbConnectionFactory.cs`
- Dependencies: IConfiguration, ILogger<DbConnectionFactory>
- Validation: Compiles, logs connection attempts
## Phase 5: SQL Query Constants
- [x] 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
- [x] 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
- [x] 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
- [x] 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
- [x] 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<T> for streaming
- Validation: Interface compiles
- [x] Create ICmsRepository interface
- Location: `Interfaces/ICmsRepository.cs`
- Methods: GetMisDataAsync
- Return type: IAsyncEnumerable<MisData>
- Validation: Interface compiles
## Phase 7: LotFinderRepository Implementation
- [x] Create LotFinderRepository class
- Location: `Repositories/LotFinderRepository.cs`
- Dependencies: IDbConnectionFactory, ILogger<LotFinderRepository>, IOptions<DataAccessOptions>
- Validation: Class compiles
- [x] Implement Search Management methods
- Methods: GetUserSearchesAsync, GetQueuedSearchesAsync, GetSearchAsync, GetSearchResultsAsync, SubmitSearchAsync, UpdateSearchStatusAsync, UpdateSearchResultsAsync
- Validation: Methods compile, use Dapper QueryAsync/ExecuteAsync
- [x] 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
- [x] 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
- [x] Create JdeRepository class
- Location: `Repositories/JdeRepository.cs`
- Dependencies: IDbConnectionFactory, ILogger<JdeRepository>, IOptions<DataAccessOptions>
- Validation: Class compiles
- [x] Implement Work Order methods
- Methods: GetWorkOrdersAsync, GetWorkOrdersArchiveAsync, GetWorkOrderStepsAsync, GetWorkOrderStepsArchiveAsync, GetWorkOrderTimesAsync, GetWorkOrderTimesArchiveAsync, GetWorkOrderRoutingsAsync, GetWorkOrderComponentsAsync, GetWorkOrderComponentsArchiveAsync
- Pattern: IAsyncEnumerable<T> with Query (buffered: false) for streaming
- Validation: Methods compile
- [x] Implement Lot methods
- Methods: GetLotsAsync, GetLotUsagesAsync, GetLotUsagesArchiveAsync, GetLotLocationsAsync
- Note: GetLotLocationsAsync uses JDE Stage connection
- Validation: Methods compile
- [x] Implement Reference Data methods
- Methods: GetItemsAsync, GetUsersAsync, GetBranchesAsync, GetProfitCentersAsync, GetWorkCentersAsync, GetStatusCodesAsync, GetFunctionCodesAsync, GetOrgHierarchyAsync, GetRouteMastersAsync
- Note: GetStatusCodesAsync uses JDE Stage connection
- Validation: Methods compile
- [x] Implement schema placeholder replacement
- Method: Private ApplySchemaReplacements method
- Replaces: {ProductionSchema}, {ArchiveSchema}, {StageSchema}
- Validation: Placeholders replaced correctly
## Phase 9: CmsRepository Implementation
- [x] Create CmsRepository class
- Location: `Repositories/CmsRepository.cs`
- Dependencies: IDbConnectionFactory, ILogger<CmsRepository>, IOptions<DataAccessOptions>
- Validation: Class compiles
- [x] Implement GetMisDataAsync method
- Pattern: IAsyncEnumerable<MisData> with Query (buffered: false) for streaming
- Timeout: Uses MisDataTimeoutSeconds from options
- Validation: Method compiles
## Phase 10: Service Registration
- [x] 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
- [x] Create test project
- Location: `NEW/tests/JdeScoping.DataAccess.Tests/JdeScoping.DataAccess.Tests.csproj`
- Dependencies: xUnit, NSubstitute, Shouldly
- Validation: Project builds
- [x] Create DbConnectionFactory tests
- Tests: Connection creation, error handling, logging
- Validation: Tests pass
- [x] Create LotFinderRepository tests
- Tests: Search methods, lookup methods, exception handling
- Mock: IDbConnectionFactory
- Validation: Tests pass
- [x] Create JdeRepository tests
- Tests: Streaming methods, cancellation, schema replacement
- Mock: IDbConnectionFactory
- Validation: Tests pass
- [x] Create CmsRepository tests
- Tests: GetMisDataAsync, timeout configuration
- Mock: IDbConnectionFactory
- Validation: Tests pass
## Phase 12: Verification
- [x] Build complete solution
- Command: `dotnet build NEW/JdeScoping.slnx`
- Validation: No build errors
- [x] Run all unit tests
- Command: `dotnet test NEW/tests/JdeScoping.DataAccess.Tests/`
- Validation: All 124 tests pass
- [x] Validate OpenSpec change
- Command: `openspec validate implement-data-access --strict`
- Validation: No validation errors
- [x] Codex MCP review
- Review: Repository implementations against spec
- Verify: All methods match spec signatures
- Verify: Query SQL matches legacy exactly