26ff8d9b4f
Set up repository with legacy .NET Framework 4.8 source (OLD/), new .NET 10 Blazor solution (NEW/), OpenSpec specifications, documentation, and project configuration.
209 lines
9.4 KiB
Markdown
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
|