feat(shared-triggers): author + persist + validate shared templates (M2.4)

`shared = true` on a group [[triggers.kv|docs|files]] flows manifest → Bundle
→ insert_trigger_tx (new shared column), mirroring sealed: shared lives on the
Trigger DTO + is part of the apply diff identity (bundle + current sides) so a
toggle re-applies. validate_bundle_for rejects shared on an app owner, on a
non-collection kind (pubsub/cron/etc.), and on a concrete collection the group
does not declare as a shared collection of that kind. Emission (M2.3) now has
authored triggers to match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
MechaCat02
2026-07-01 20:55:49 +02:00
parent 0210ace406
commit f04eaed0b7
5 changed files with 151 additions and 14 deletions

View File

@@ -909,6 +909,7 @@ mod tests {
kind: crate::trigger_repo::TriggerKind::Kv,
enabled: true,
sealed: false,
shared: false,
dispatch_mode: req.dispatch_mode,
retry_max_attempts: req.retry_max_attempts,
retry_backoff: req.retry_backoff,
@@ -940,6 +941,7 @@ mod tests {
kind: crate::trigger_repo::TriggerKind::Docs,
enabled: true,
sealed: false,
shared: false,
dispatch_mode: req.dispatch_mode,
retry_max_attempts: req.retry_max_attempts,
retry_backoff: req.retry_backoff,
@@ -971,6 +973,7 @@ mod tests {
kind: crate::trigger_repo::TriggerKind::DeadLetter,
enabled: true,
sealed: false,
shared: false,
dispatch_mode: TriggerDispatchMode::Async,
retry_max_attempts: 1,
retry_backoff: BackoffShape::Constant,
@@ -1003,6 +1006,7 @@ mod tests {
kind: TriggerKind::Email,
enabled: true,
sealed: false,
shared: false,
dispatch_mode: TriggerDispatchMode::Async,
retry_max_attempts: 3,
retry_backoff: BackoffShape::Exponential,
@@ -1050,6 +1054,7 @@ mod tests {
kind: crate::trigger_repo::TriggerKind::Cron,
enabled: true,
sealed: false,
shared: false,
dispatch_mode: req.dispatch_mode,
retry_max_attempts: req.retry_max_attempts,
retry_backoff: req.retry_backoff,
@@ -1082,6 +1087,7 @@ mod tests {
kind: crate::trigger_repo::TriggerKind::Files,
enabled: true,
sealed: false,
shared: false,
dispatch_mode: req.dispatch_mode,
retry_max_attempts: req.retry_max_attempts,
retry_backoff: req.retry_backoff,
@@ -1113,6 +1119,7 @@ mod tests {
kind: crate::trigger_repo::TriggerKind::Pubsub,
enabled: true,
sealed: false,
shared: false,
dispatch_mode: req.dispatch_mode,
retry_max_attempts: req.retry_max_attempts,
retry_backoff: req.retry_backoff,
@@ -1192,6 +1199,7 @@ mod tests {
kind: TriggerKind::Queue,
enabled: true,
sealed: false,
shared: false,
dispatch_mode: req.dispatch_mode,
retry_max_attempts: req.retry_max_attempts,
retry_backoff: req.retry_backoff,