diff --git a/backend/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/plugins/IdempotencyPlugin.kt b/backend/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/plugins/IdempotencyPlugin.kt new file mode 100644 index 00000000..578ab8f0 --- /dev/null +++ b/backend/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/plugins/IdempotencyPlugin.kt @@ -0,0 +1,26 @@ +package at.mocode.masterdata.api.plugins + +import io.ktor.server.application.* +import io.ktor.util.* +import java.time.Duration + +/** + * Minimaler Ktor-Plugin-Skeleton für Idempotency-Key Verarbeitung. + * Aktuell: Stellt den Header `Idempotency-Key` als Call-Attribut bereit. + * Erweiterung (Cache/Short-Circuit) folgt im nächsten Schritt. + */ +object IdempotencyPlugin { + @JvmInline + value class Configuration(val ttl: Duration = Duration.ofMinutes(5)) + + val IdempotencyKeyAttr: AttributeKey = AttributeKey("IdempotencyKey") + + fun install(application: Application, configuration: Configuration = Configuration()) { + application.intercept(ApplicationCallPipeline.Plugins) { + val key = call.request.headers["Idempotency-Key"]?.trim() + if (!key.isNullOrBlank()) { + call.attributes.put(IdempotencyKeyAttr, key) + } + } + } +}