From 96ba7cd711307118565068548cded72ec2e4eb9b Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 7 Apr 2026 23:06:17 +0200 Subject: [PATCH] feat: add LicenseInfo and Feature domain model - Feature enum with topology, lineage, correlation, debugger, replay - LicenseInfo record with tier, features, limits, issuedAt, expiresAt - Open mode factory method for standalone/dev usage --- .../server/core/license/Feature.java | 9 ++++++ .../server/core/license/LicenseInfo.java | 30 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 cameleer3-server-core/src/main/java/com/cameleer3/server/core/license/Feature.java create mode 100644 cameleer3-server-core/src/main/java/com/cameleer3/server/core/license/LicenseInfo.java diff --git a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/license/Feature.java b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/license/Feature.java new file mode 100644 index 00000000..42d6a0d5 --- /dev/null +++ b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/license/Feature.java @@ -0,0 +1,9 @@ +package com.cameleer3.server.core.license; + +public enum Feature { + topology, + lineage, + correlation, + debugger, + replay +} diff --git a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/license/LicenseInfo.java b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/license/LicenseInfo.java new file mode 100644 index 00000000..e71d395c --- /dev/null +++ b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/license/LicenseInfo.java @@ -0,0 +1,30 @@ +package com.cameleer3.server.core.license; + +import java.time.Instant; +import java.util.Map; +import java.util.Set; + +public record LicenseInfo( + String tier, + Set features, + Map limits, + Instant issuedAt, + Instant expiresAt +) { + public boolean isExpired() { + return expiresAt != null && Instant.now().isAfter(expiresAt); + } + + public boolean hasFeature(Feature feature) { + return features.contains(feature); + } + + public int getLimit(String key, int defaultValue) { + return limits.getOrDefault(key, defaultValue); + } + + /** Open license — all features enabled, no limits. Used when no license is configured. */ + public static LicenseInfo open() { + return new LicenseInfo("open", Set.of(Feature.values()), Map.of(), Instant.now(), null); + } +}