package com.talentcard.server.business.merchant; import java.sql.Connection; import java.sql.ResultSet; import java.util.LinkedHashMap; import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; /** Keeps merchant onboarding additive columns available when Flyway is disabled in the deployment. */ @Slf4j @Component public class MerchantOnboardingSchemaInitializer implements ApplicationRunner { private final JdbcTemplate jdbc; public MerchantOnboardingSchemaInitializer(JdbcTemplate jdbc) { this.jdbc = jdbc; } @Override public void run(ApplicationArguments args) { try { Map columns = new LinkedHashMap<>(); columns.put("merchant_name", "varchar(128) default null"); columns.put("merchant_short_name", "varchar(128) default null"); columns.put("company_type", "varchar(64) default null"); columns.put("business_license_url", "varchar(512) default null"); columns.put("established_date", "char(10) default null"); columns.put("registered_capital", "varchar(64) default null"); columns.put("legal_id_front_url", "varchar(512) default null"); columns.put("legal_id_back_url", "varchar(512) default null"); columns.put("legal_certificate_address", "varchar(255) default null"); columns.put("administrator_email", "varchar(128) default null"); columns.put("initial_bank_card_id", "bigint default null"); columns.put("provider_huifu_id", "varchar(32) default null"); columns.put("provider_apply_no", "varchar(32) default null"); columns.put("provider_response_code", "varchar(32) default null"); columns.put("provider_response_message", "varchar(512) default null"); columns.put("wechat_config_status", "varchar(16) not null default 'not_started'"); columns.put("wechat_config_request_no", "varchar(32) default null"); columns.put("wechat_config_response_code", "varchar(32) default null"); columns.put("wechat_config_response_message", "varchar(512) default null"); columns.put("business_open_status", "varchar(16) not null default 'not_started'"); columns.put("business_open_request_no", "varchar(32) default null"); columns.put("business_open_apply_no", "varchar(32) default null"); columns.put("business_open_response_code", "varchar(32) default null"); columns.put("business_open_response_message", "varchar(512) default null"); for (Map.Entry column : columns.entrySet()) { if (!hasColumn("merchant_onboarding_application", column.getKey())) jdbc.execute("alter table merchant_onboarding_application add column " + column.getKey() + " " + column.getValue()); } Map bankCardColumns = new LinkedHashMap<>(); bankCardColumns.put("provider_token_no", "varchar(32) default null"); bankCardColumns.put("provider_apply_no", "varchar(32) default null"); bankCardColumns.put("provider_request_no", "varchar(32) default null"); bankCardColumns.put("provider_response_code", "varchar(32) default null"); bankCardColumns.put("provider_response_message", "varchar(512) default null"); bankCardColumns.put("card_no_encrypted", "varchar(1024) default null"); bankCardColumns.put("branch_code", "varchar(12) default null"); for (Map.Entry column : bankCardColumns.entrySet()) { if (!hasColumn("merchant_bank_card", column.getKey())) jdbc.execute("alter table merchant_bank_card add column " + column.getKey() + " " + column.getValue()); } } catch (Exception exception) { log.warn("Merchant onboarding schema initialization failed", exception); } } private boolean hasColumn(String tableName, String columnName) throws Exception { try (Connection connection = jdbc.getDataSource().getConnection(); ResultSet result = connection.getMetaData().getColumns(connection.getCatalog(), null, tableName, columnName)) { if (result.next()) return true; } try (Connection connection = jdbc.getDataSource().getConnection(); ResultSet result = connection.getMetaData().getColumns(connection.getCatalog(), null, tableName.toUpperCase(), columnName.toUpperCase())) { return result.next(); } } }