fix(validation): migrate DB config from env to ConfigManager

- Refactor getValidationDatabaseService() to use ConfigManager
- Refactor getTableName() to use ConfigManager.getDatabaseType()
- Replace all process.env.DB_TYPE references with ConfigManager API
- Simplify isSqlServer checks from 'sqlserver||mssql' to 'sqlserver'
- Preserve all business logic and dual-database support
- Typecheck passes successfully

Fixes issue where Cleaner page failed with 'Failed to connect to MySQL'
due to validation-handler.ts not being migrated in commit c13be9e
This commit is contained in:
test
2026-03-07 15:14:15 +08:00
parent c7c192a703
commit 73b8f2409a

View File

@@ -12,6 +12,7 @@ import { MySqlService } from '../services/database/mysql'
import { SqlServerService } from '../services/database/sql-server' import { SqlServerService } from '../services/database/sql-server'
import { MaterialsToBeDeletedDAO } from '../services/database/materials-to-be-deleted-dao' import { MaterialsToBeDeletedDAO } from '../services/database/materials-to-be-deleted-dao'
import { DiscreteMaterialPlanDAO } from '../services/database/discrete-material-plan-dao' import { DiscreteMaterialPlanDAO } from '../services/database/discrete-material-plan-dao'
import { ConfigManager } from '../services/config/config-manager'
import { createLogger } from '../services/logger' import { createLogger } from '../services/logger'
import type { import type {
ValidationRequest, ValidationRequest,
@@ -57,29 +58,33 @@ export function clearSharedProductionIds(): void {
* Get database service for validation operations (MySQL or SQL Server) * Get database service for validation operations (MySQL or SQL Server)
*/ */
async function getValidationDatabaseService(): Promise<MySqlService | SqlServerService> { async function getValidationDatabaseService(): Promise<MySqlService | SqlServerService> {
const dbType = process.env.DB_TYPE?.toLowerCase() const configManager = ConfigManager.getInstance()
const config = configManager.getConfig()
const dbType = configManager.getDatabaseType()
if (dbType === 'sqlserver' || dbType === 'mssql') { if (dbType === 'sqlserver') {
const dbConfig = config.database.sqlserver
const sqlServerService = new SqlServerService({ const sqlServerService = new SqlServerService({
server: process.env.DB_SERVER || 'localhost', server: dbConfig.server,
port: parseInt(process.env.DB_SQLSERVER_PORT || '1433', 10), port: dbConfig.port,
user: process.env.DB_USERNAME || 'sa', user: dbConfig.username,
password: process.env.DB_PASSWORD || '', password: dbConfig.password,
database: process.env.DB_NAME || '', database: dbConfig.database,
options: { options: {
encrypt: false, encrypt: false,
trustServerCertificate: process.env.DB_TRUST_SERVER_CERTIFICATE === 'yes' trustServerCertificate: dbConfig.trustServerCertificate
} }
}) })
await sqlServerService.connect() await sqlServerService.connect()
return sqlServerService return sqlServerService
} else { } else {
const dbConfig = config.database.mysql
const mysqlService = new MySqlService({ const mysqlService = new MySqlService({
host: process.env.DB_MYSQL_HOST || 'localhost', host: dbConfig.host,
port: parseInt(process.env.DB_MYSQL_PORT || '3306', 10), port: dbConfig.port,
user: process.env.DB_USERNAME || 'root', user: dbConfig.username,
password: process.env.DB_PASSWORD || '', password: dbConfig.password,
database: process.env.DB_NAME || '' database: dbConfig.database
}) })
await mysqlService.connect() await mysqlService.connect()
return mysqlService return mysqlService
@@ -93,8 +98,10 @@ async function getValidationDatabaseService(): Promise<MySqlService | SqlServerS
* dbo_MaterialsToBeDeleted -> [dbo].[MaterialsToBeDeleted] * dbo_MaterialsToBeDeleted -> [dbo].[MaterialsToBeDeleted]
*/ */
function getTableName(mysqlTableName: string): string { function getTableName(mysqlTableName: string): string {
const dbType = process.env.DB_TYPE?.toLowerCase() const configManager = ConfigManager.getInstance()
if (dbType === 'sqlserver' || dbType === 'mssql') { const dbType = configManager.getDatabaseType()
if (dbType === 'sqlserver') {
// Find the FIRST underscore to split schema and table name // Find the FIRST underscore to split schema and table name
// This handles patterns like: schema_tablename // This handles patterns like: schema_tablename
const firstUnderscoreIndex = mysqlTableName.indexOf('_') const firstUnderscoreIndex = mysqlTableName.indexOf('_')
@@ -145,8 +152,9 @@ async function getSourceNumbersFromInputs(
): Promise<string[]> { ): Promise<string[]> {
const productionIds: string[] = [] const productionIds: string[] = []
const orderNumbers: string[] = [] const orderNumbers: string[] = []
const dbType = process.env.DB_TYPE?.toLowerCase() const configManager = ConfigManager.getInstance()
const isSqlServer = dbType === 'sqlserver' || dbType === 'mssql' const dbType = configManager.getDatabaseType()
const isSqlServer = dbType === 'sqlserver'
for (const item of inputs) { for (const item of inputs) {
const type = identifyInputType(item) const type = identifyInputType(item)
@@ -255,8 +263,9 @@ export function registerValidationHandlers(): void {
// Connect to database // Connect to database
dbService = await getValidationDatabaseService() dbService = await getValidationDatabaseService()
const dbType = process.env.DB_TYPE?.toLowerCase() const configManager = ConfigManager.getInstance()
const isSqlServer = dbType === 'sqlserver' || dbType === 'mssql' const dbType = configManager.getDatabaseType()
const isSqlServer = dbType === 'sqlserver'
let sourceNumbers: string[] | null = null let sourceNumbers: string[] | null = null
@@ -534,8 +543,9 @@ export function registerValidationHandlers(): void {
try { try {
dbService = await getValidationDatabaseService() dbService = await getValidationDatabaseService()
const dbType = process.env.DB_TYPE?.toLowerCase() const configManager = ConfigManager.getInstance()
const isSqlServer = dbType === 'sqlserver' || dbType === 'mssql' const dbType = configManager.getDatabaseType()
const isSqlServer = dbType === 'sqlserver'
const dao = new MaterialsToBeDeletedDAO() const dao = new MaterialsToBeDeletedDAO()
const materials = await dao.getMaterialsByManager(managerName) const materials = await dao.getMaterialsByManager(managerName)
@@ -612,8 +622,9 @@ export function registerValidationHandlers(): void {
try { try {
dbService = await getValidationDatabaseService() dbService = await getValidationDatabaseService()
const dbType = process.env.DB_TYPE?.toLowerCase() const configManager = ConfigManager.getInstance()
const isSqlServer = dbType === 'sqlserver' || dbType === 'mssql' const dbType = configManager.getDatabaseType()
const isSqlServer = dbType === 'sqlserver'
const dao = new MaterialsToBeDeletedDAO() const dao = new MaterialsToBeDeletedDAO()
const materials = await dao.getAllRecords() const materials = await dao.getAllRecords()
@@ -745,8 +756,9 @@ export function registerValidationHandlers(): void {
const isAdmin = userInfo.userType === 'Admin' const isAdmin = userInfo.userType === 'Admin'
const username = userInfo.username const username = userInfo.username
const dbType = process.env.DB_TYPE?.toLowerCase() const configManager = ConfigManager.getInstance()
const isSqlServer = dbType === 'sqlserver' || dbType === 'mssql' const dbType = configManager.getDatabaseType()
const isSqlServer = dbType === 'sqlserver'
log.info(`User: ${username}, isAdmin: ${isAdmin}`) log.info(`User: ${username}, isAdmin: ${isAdmin}`)