diff --git a/src/main/java/com/yau/digitalrmb/identity/infrastructure/persistence/PlatformUserSnapshotSchemaUpgrade.java b/src/main/java/com/yau/digitalrmb/identity/infrastructure/persistence/PlatformUserSnapshotSchemaUpgrade.java new file mode 100644 index 0000000..56a9e4c --- /dev/null +++ b/src/main/java/com/yau/digitalrmb/identity/infrastructure/persistence/PlatformUserSnapshotSchemaUpgrade.java @@ -0,0 +1,43 @@ +package com.yau.digitalrmb.identity.infrastructure.persistence; + +import javax.annotation.PostConstruct; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +@Component +public class PlatformUserSnapshotSchemaUpgrade { + private static final String[][] PROFILE_COLUMNS = { + {"school_id", "VARCHAR(64) NULL"}, + {"school_name", "VARCHAR(128) NULL"}, + {"college_id", "VARCHAR(64) NULL"}, + {"college_name", "VARCHAR(128) NULL"}, + {"major_id", "VARCHAR(64) NULL"}, + {"major_name", "VARCHAR(128) NULL"}, + {"role_id", "BIGINT NULL"}, + {"class_id", "VARCHAR(64) NULL"}, + {"class_name", "VARCHAR(128) NULL"}, + {"student_id", "VARCHAR(64) NULL"} + }; + + private final JdbcTemplate jdbcTemplate; + + public PlatformUserSnapshotSchemaUpgrade(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @PostConstruct + public void ensureColumns() { + for (String[] column : PROFILE_COLUMNS) { + if (!columnExists(column[0])) { + jdbcTemplate.execute("ALTER TABLE platform_user_snapshot ADD COLUMN " + column[0] + " " + column[1]); + } + } + } + + private boolean columnExists(String columnName) { + Integer count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS " + + "WHERE LOWER(TABLE_NAME) = 'platform_user_snapshot' AND LOWER(COLUMN_NAME) = ?", Integer.class, + columnName); + return count != null && count > 0; + } +} diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 5eb0645..b04325a 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -47,17 +47,6 @@ CREATE TABLE IF NOT EXISTS platform_user_snapshot ( student_id VARCHAR(64) NULL ); -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS school_id VARCHAR(64) NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS school_name VARCHAR(128) NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS college_id VARCHAR(64) NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS college_name VARCHAR(128) NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS major_id VARCHAR(64) NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS major_name VARCHAR(128) NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS role_id BIGINT NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS class_id VARCHAR(64) NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS class_name VARCHAR(128) NULL; -ALTER TABLE platform_user_snapshot ADD COLUMN IF NOT EXISTS student_id VARCHAR(64) NULL; - CREATE TABLE IF NOT EXISTS auth_login_exchange_code ( code_hash CHAR(64) PRIMARY KEY, platform_user_id BIGINT NOT NULL, diff --git a/src/test/java/com/yau/digitalrmb/identity/PlatformUserSnapshotSchemaUpgradeTest.java b/src/test/java/com/yau/digitalrmb/identity/PlatformUserSnapshotSchemaUpgradeTest.java new file mode 100644 index 0000000..7c66f79 --- /dev/null +++ b/src/test/java/com/yau/digitalrmb/identity/PlatformUserSnapshotSchemaUpgradeTest.java @@ -0,0 +1,28 @@ +package com.yau.digitalrmb.identity; + +import com.yau.digitalrmb.identity.infrastructure.persistence.PlatformUserSnapshotSchemaUpgrade; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ActiveProfiles; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@ActiveProfiles("test") +class PlatformUserSnapshotSchemaUpgradeTest { + @Autowired private JdbcTemplate jdbcTemplate; + @Autowired private PlatformUserSnapshotSchemaUpgrade schemaUpgrade; + + @Test + void restoresMissingProfileColumnWithPortableAlterStatement() { + jdbcTemplate.execute("ALTER TABLE platform_user_snapshot DROP COLUMN student_id"); + + schemaUpgrade.ensureColumns(); + + Integer count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS " + + "WHERE LOWER(TABLE_NAME) = 'platform_user_snapshot' AND LOWER(COLUMN_NAME) = 'student_id'", Integer.class); + assertThat(count).isEqualTo(1); + } +}