From 84641fe81ab84a43d2b577262cdd50a5df712824 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 14 Apr 2026 18:08:45 +0200 Subject: [PATCH] feat: add PostgresSensitiveKeysRepository --- .../PostgresSensitiveKeysRepository.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresSensitiveKeysRepository.java diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresSensitiveKeysRepository.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresSensitiveKeysRepository.java new file mode 100644 index 00000000..325cc77e --- /dev/null +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresSensitiveKeysRepository.java @@ -0,0 +1,58 @@ +package com.cameleer3.server.app.storage; + +import com.cameleer3.server.core.admin.SensitiveKeysConfig; +import com.cameleer3.server.core.admin.SensitiveKeysRepository; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class PostgresSensitiveKeysRepository implements SensitiveKeysRepository { + + private final JdbcTemplate jdbc; + private final ObjectMapper objectMapper; + + public PostgresSensitiveKeysRepository(JdbcTemplate jdbc, ObjectMapper objectMapper) { + this.jdbc = jdbc; + this.objectMapper = objectMapper; + } + + @Override + public Optional find() { + List results = jdbc.query( + "SELECT config_val FROM server_config WHERE config_key = 'sensitive_keys'", + (rs, rowNum) -> { + String json = rs.getString("config_val"); + try { + return objectMapper.readValue(json, SensitiveKeysConfig.class); + } catch (JsonProcessingException e) { + throw new RuntimeException("Failed to deserialize sensitive keys config", e); + } + }); + return results.isEmpty() ? Optional.empty() : Optional.of(results.get(0)); + } + + @Override + public void save(SensitiveKeysConfig config, String updatedBy) { + String json; + try { + json = objectMapper.writeValueAsString(config); + } catch (JsonProcessingException e) { + throw new RuntimeException("Failed to serialize sensitive keys config", e); + } + + jdbc.update(""" + INSERT INTO server_config (config_key, config_val, updated_by, updated_at) + VALUES ('sensitive_keys', ?::jsonb, ?, now()) + ON CONFLICT (config_key) DO UPDATE SET + config_val = EXCLUDED.config_val, + updated_by = EXCLUDED.updated_by, + updated_at = now() + """, + json, updatedBy); + } +}