Set up repository with legacy .NET Framework 4.8 source (OLD/), new .NET 10 Blazor solution (NEW/), OpenSpec specifications, documentation, and project configuration.
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
- Location:
-
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 restoresucceeds
-
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
- Location:
-
Create ConnectionException class
- Location:
Exceptions/ConnectionException.cs - Properties: DataSource (inherits from DataAccessException)
- Validation: Class compiles
- Location:
-
Create QueryException class
- Location:
Exceptions/QueryException.cs - Properties: QueryName (inherits from DataAccessException)
- Validation: Class compiles
- Location:
-
Create DataAccessTimeoutException class
- Location:
Exceptions/DataAccessTimeoutException.cs - Properties: TimeoutSeconds (inherits from DataAccessException)
- Validation: Class compiles
- Location:
Phase 3: Configuration
- Create DataAccessOptions class
- Location:
Configuration/DataAccessOptions.cs - Properties: DefaultTimeoutSeconds, LotUsageTimeoutSeconds, MisDataTimeoutSeconds, RebuildIndexTimeoutSeconds, ProductionSchema, ArchiveSchema, StageSchema
- Validation: Class compiles with default values
- Location:
Phase 4: Connection Factory
-
Create IDbConnectionFactory interface
- Location:
Interfaces/IDbConnectionFactory.cs - Methods: CreateLotFinderConnectionAsync, CreateJdeConnectionAsync, CreateJdeStageConnectionAsync, CreateCmsConnectionAsync
- Validation: Interface compiles
- Location:
-
Create DbConnectionFactory implementation
- Location:
DbConnectionFactory.cs - Dependencies: IConfiguration, ILogger
- Validation: Compiles, logs connection attempts
- Location:
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
- Location:
-
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
- Location:
-
Create CmsQueries static class
- Location:
Queries/CmsQueries.cs - Contains: SQL_GET_MIS_DATA query from spec
- Validation: Query compiles as const string
- Location:
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
- Location:
-
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
- Location:
-
Create ICmsRepository interface
- Location:
Interfaces/ICmsRepository.cs - Methods: GetMisDataAsync
- Return type: IAsyncEnumerable
- Validation: Interface compiles
- Location:
Phase 7: LotFinderRepository Implementation
-
Create LotFinderRepository class
- Location:
Repositories/LotFinderRepository.cs - Dependencies: IDbConnectionFactory, ILogger, IOptions
- Validation: Class compiles
- Location:
-
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
- Location:
-
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
- Location:
-
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
- Location:
Phase 11: Unit Tests
-
Create test project
- Location:
NEW/tests/JdeScoping.DataAccess.Tests/JdeScoping.DataAccess.Tests.csproj - Dependencies: xUnit, NSubstitute, Shouldly
- Validation: Project builds
- Location:
-
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
- Command:
-
Run all unit tests
- Command:
dotnet test NEW/tests/JdeScoping.DataAccess.Tests/ - Validation: All 124 tests pass
- Command:
-
Validate OpenSpec change
- Command:
openspec validate implement-data-access --strict - Validation: No validation errors
- Command:
-
Codex MCP review
- Review: Repository implementations against spec
- Verify: All methods match spec signatures
- Verify: Query SQL matches legacy exactly