diff --git a/backend/src/main/kotlin/com/opendatamask/model/JobLog.kt b/backend/src/main/kotlin/com/opendatamask/model/JobLog.kt index 8be795e..f933112 100644 --- a/backend/src/main/kotlin/com/opendatamask/model/JobLog.kt +++ b/backend/src/main/kotlin/com/opendatamask/model/JobLog.kt @@ -4,7 +4,7 @@ import jakarta.persistence.* import java.time.LocalDateTime enum class LogLevel { - INFO, WARN, ERROR + DEBUG, INFO, WARN, ERROR } @Entity diff --git a/backend/src/main/kotlin/com/opendatamask/model/TableConfiguration.kt b/backend/src/main/kotlin/com/opendatamask/model/TableConfiguration.kt index c1f1f1a..00b1bfe 100644 --- a/backend/src/main/kotlin/com/opendatamask/model/TableConfiguration.kt +++ b/backend/src/main/kotlin/com/opendatamask/model/TableConfiguration.kt @@ -4,7 +4,7 @@ import jakarta.persistence.* import java.time.LocalDateTime enum class TableMode { - PASSTHROUGH, MASK, GENERATE, SUBSET + PASSTHROUGH, MASK, GENERATE, SUBSET, SKIP } @Entity diff --git a/backend/src/main/kotlin/com/opendatamask/service/JobService.kt b/backend/src/main/kotlin/com/opendatamask/service/JobService.kt index d8659be..8f0c185 100644 --- a/backend/src/main/kotlin/com/opendatamask/service/JobService.kt +++ b/backend/src/main/kotlin/com/opendatamask/service/JobService.kt @@ -123,6 +123,10 @@ class JobService( addLog(job.id, "Processing ${tableConfigs.size} table(s)", LogLevel.INFO) for (tableConfig in tableConfigs) { + if (tableConfig.mode == TableMode.SKIP) { + addLog(job.id, "Skipping table: ${tableConfig.tableName}", LogLevel.INFO) + continue + } addLog(job.id, "Mirroring schema for table: ${tableConfig.tableName}", LogLevel.INFO) destinationSchemaService.mirrorSchema( sourceConnector, sourceConn.type, @@ -194,6 +198,9 @@ class JobService( val written = destConnector.writeData(tableConfig.tableName, data) addLog(jobId, "Wrote $written rows to destination ${tableConfig.tableName}", LogLevel.INFO) } + TableMode.SKIP -> { + // unreachable: SKIP tables are short-circuited in the calling loop + } } } diff --git a/backend/src/test/kotlin/com/opendatamask/model/EnumAlignmentTest.kt b/backend/src/test/kotlin/com/opendatamask/model/EnumAlignmentTest.kt index 83a6ab8..c01bbae 100644 --- a/backend/src/test/kotlin/com/opendatamask/model/EnumAlignmentTest.kt +++ b/backend/src/test/kotlin/com/opendatamask/model/EnumAlignmentTest.kt @@ -21,8 +21,37 @@ class EnumAlignmentTest { } @Test - fun `WorkspaceRole contains VIEWER`() { + fun `UserRole contains canonical set`() { + val values = UserRole.values().map { it.name }.toSet() + val expected = setOf("ADMIN", "USER", "VIEWER") + assertEquals(expected, values, "UserRole values do not match canonical set") + } + + @Test + fun `WorkspaceRole contains canonical set`() { val values = WorkspaceRole.values().map { it.name }.toSet() - assertTrue(values.contains("VIEWER"), "WorkspaceRole must contain VIEWER") + val expected = setOf("ADMIN", "USER", "VIEWER") + assertEquals(expected, values, "WorkspaceRole values do not match canonical set") + } + + @Test + fun `TableMode contains canonical set`() { + val values = TableMode.values().map { it.name }.toSet() + val expected = setOf("PASSTHROUGH", "MASK", "GENERATE", "SUBSET", "SKIP") + assertEquals(expected, values, "TableMode values do not match canonical set") + } + + @Test + fun `LogLevel contains canonical set`() { + val values = LogLevel.values().map { it.name }.toSet() + val expected = setOf("DEBUG", "INFO", "WARN", "ERROR") + assertEquals(expected, values, "LogLevel values do not match canonical set") + } + + @Test + fun `JobStatus contains canonical set`() { + val values = JobStatus.values().map { it.name }.toSet() + val expected = setOf("PENDING", "RUNNING", "COMPLETED", "FAILED", "CANCELLED") + assertEquals(expected, values, "JobStatus values do not match canonical set") } }