feat(outbound): core domain records for outbound connections

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-19 16:10:17 +02:00
parent 0c9d12d8e0
commit 46b8f63fd1
6 changed files with 95 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
package com.cameleer.server.core.outbound;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
@JsonSubTypes({
@JsonSubTypes.Type(OutboundAuth.None.class),
@JsonSubTypes.Type(OutboundAuth.Bearer.class),
@JsonSubTypes.Type(OutboundAuth.Basic.class),
})
public sealed interface OutboundAuth permits OutboundAuth.None, OutboundAuth.Bearer, OutboundAuth.Basic {
OutboundAuthKind kind();
record None() implements OutboundAuth {
public OutboundAuthKind kind() { return OutboundAuthKind.NONE; }
}
record Bearer(String tokenCiphertext) implements OutboundAuth {
public OutboundAuthKind kind() { return OutboundAuthKind.BEARER; }
}
record Basic(String username, String passwordCiphertext) implements OutboundAuth {
public OutboundAuthKind kind() { return OutboundAuthKind.BASIC; }
}
}

View File

@@ -0,0 +1,3 @@
package com.cameleer.server.core.outbound;
public enum OutboundAuthKind { NONE, BEARER, BASIC }

View File

@@ -0,0 +1,39 @@
package com.cameleer.server.core.outbound;
import com.cameleer.server.core.http.TrustMode;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public record OutboundConnection(
UUID id,
String tenantId,
String name,
String description,
String url,
OutboundMethod method,
Map<String, String> defaultHeaders,
String defaultBodyTmpl,
TrustMode tlsTrustMode,
List<String> tlsCaPemPaths,
String hmacSecretCiphertext,
OutboundAuth auth,
List<UUID> allowedEnvironmentIds,
Instant createdAt,
UUID createdBy,
Instant updatedAt,
UUID updatedBy
) {
public OutboundConnection {
defaultHeaders = defaultHeaders == null ? Map.of() : Map.copyOf(defaultHeaders);
tlsCaPemPaths = tlsCaPemPaths == null ? List.of() : List.copyOf(tlsCaPemPaths);
allowedEnvironmentIds = allowedEnvironmentIds == null ? List.of() : List.copyOf(allowedEnvironmentIds);
if (auth == null) auth = new OutboundAuth.None();
}
public boolean isAllowedInEnvironment(UUID environmentId) {
return allowedEnvironmentIds.isEmpty() || allowedEnvironmentIds.contains(environmentId);
}
}

View File

@@ -0,0 +1,13 @@
package com.cameleer.server.core.outbound;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
public interface OutboundConnectionRepository {
OutboundConnection save(OutboundConnection connection);
Optional<OutboundConnection> findById(String tenantId, UUID id);
Optional<OutboundConnection> findByName(String tenantId, String name);
List<OutboundConnection> listByTenant(String tenantId);
void delete(String tenantId, UUID id);
}

View File

@@ -0,0 +1,13 @@
package com.cameleer.server.core.outbound;
import java.util.List;
import java.util.UUID;
public interface OutboundConnectionService {
OutboundConnection create(OutboundConnection draft, UUID actingUserId);
OutboundConnection update(UUID id, OutboundConnection draft, UUID actingUserId);
void delete(UUID id, UUID actingUserId);
OutboundConnection get(UUID id);
List<OutboundConnection> list();
List<UUID> rulesReferencing(UUID id);
}

View File

@@ -0,0 +1,3 @@
package com.cameleer.server.core.outbound;
public enum OutboundMethod { POST, PUT, PATCH }