diff --git a/crates/manager-core/src/apply_service.rs b/crates/manager-core/src/apply_service.rs index da73054..95cbbe0 100644 --- a/crates/manager-core/src/apply_service.rs +++ b/crates/manager-core/src/apply_service.rs @@ -1445,7 +1445,13 @@ fn disabled_target_warnings(bundle: &Bundle) -> Vec { if r.enabled && disabled.contains(r.script.as_str()) { out.push(format!( "route `{}` is enabled but its script `{}` is disabled — it will 404", - route_key(r.method.as_deref(), r.host_kind, &r.host, r.path_kind, &r.path), + route_key( + r.method.as_deref(), + r.host_kind, + &r.host, + r.path_kind, + &r.path + ), r.script )); } @@ -1919,6 +1925,7 @@ mod tests { id: TriggerId::from(uuid::Uuid::new_v4()), app_id: AppId::from(uuid::Uuid::nil()), script_id, + name: "t".into(), kind, enabled: true, dispatch_mode: TriggerDispatchMode::Async, diff --git a/crates/manager-core/src/trigger_repo.rs b/crates/manager-core/src/trigger_repo.rs index 2b4da4b..244af2a 100644 --- a/crates/manager-core/src/trigger_repo.rs +++ b/crates/manager-core/src/trigger_repo.rs @@ -34,6 +34,8 @@ pub struct Trigger { pub id: TriggerId, pub app_id: AppId, pub script_id: ScriptId, + /// §4.5 per-app trigger identifier; the manifest merge/upsert key. + pub name: String, pub kind: TriggerKind, pub enabled: bool, pub dispatch_mode: TriggerDispatchMode, @@ -735,7 +737,7 @@ impl TriggerRepo for PostgresTriggerRepo { retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal \ ) VALUES ($1, $2, 'kv', TRUE, $3, $4, $5, $6, $7) \ - RETURNING id, app_id, script_id, kind, enabled, dispatch_mode, \ + RETURNING id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at", ) @@ -766,6 +768,7 @@ impl TriggerRepo for PostgresTriggerRepo { id: parent.id.into(), app_id: parent.app_id.into(), script_id: parent.script_id.into(), + name: parent.name.clone(), kind: TriggerKind::Kv, enabled: parent.enabled, dispatch_mode: dispatch_from_str(&parent.dispatch_mode), @@ -800,7 +803,7 @@ impl TriggerRepo for PostgresTriggerRepo { retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal \ ) VALUES ($1, $2, 'docs', TRUE, $3, $4, $5, $6, $7) \ - RETURNING id, app_id, script_id, kind, enabled, dispatch_mode, \ + RETURNING id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at", ) @@ -831,6 +834,7 @@ impl TriggerRepo for PostgresTriggerRepo { id: parent.id.into(), app_id: parent.app_id.into(), script_id: parent.script_id.into(), + name: parent.name.clone(), kind: TriggerKind::Docs, enabled: parent.enabled, dispatch_mode: dispatch_from_str(&parent.dispatch_mode), @@ -863,7 +867,7 @@ impl TriggerRepo for PostgresTriggerRepo { retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal \ ) VALUES ($1, $2, 'dead_letter', TRUE, 'async', 1, 'constant', 0, $3) \ - RETURNING id, app_id, script_id, kind, enabled, dispatch_mode, \ + RETURNING id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at", ) @@ -891,6 +895,7 @@ impl TriggerRepo for PostgresTriggerRepo { id: parent.id.into(), app_id: parent.app_id.into(), script_id: parent.script_id.into(), + name: parent.name.clone(), kind: TriggerKind::DeadLetter, enabled: parent.enabled, dispatch_mode: dispatch_from_str(&parent.dispatch_mode), @@ -927,7 +932,7 @@ impl TriggerRepo for PostgresTriggerRepo { retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal \ ) VALUES ($1, $2, 'cron', TRUE, $3, $4, $5, $6, $7) \ - RETURNING id, app_id, script_id, kind, enabled, dispatch_mode, \ + RETURNING id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at", ) @@ -957,6 +962,7 @@ impl TriggerRepo for PostgresTriggerRepo { id: parent.id.into(), app_id: parent.app_id.into(), script_id: parent.script_id.into(), + name: parent.name.clone(), kind: TriggerKind::Cron, enabled: parent.enabled, dispatch_mode: dispatch_from_str(&parent.dispatch_mode), @@ -992,7 +998,7 @@ impl TriggerRepo for PostgresTriggerRepo { retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal \ ) VALUES ($1, $2, 'files', TRUE, $3, $4, $5, $6, $7) \ - RETURNING id, app_id, script_id, kind, enabled, dispatch_mode, \ + RETURNING id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at", ) @@ -1023,6 +1029,7 @@ impl TriggerRepo for PostgresTriggerRepo { id: parent.id.into(), app_id: parent.app_id.into(), script_id: parent.script_id.into(), + name: parent.name.clone(), kind: TriggerKind::Files, enabled: parent.enabled, dispatch_mode: dispatch_from_str(&parent.dispatch_mode), @@ -1056,7 +1063,7 @@ impl TriggerRepo for PostgresTriggerRepo { retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal \ ) VALUES ($1, $2, 'pubsub', TRUE, $3, $4, $5, $6, $7) \ - RETURNING id, app_id, script_id, kind, enabled, dispatch_mode, \ + RETURNING id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at", ) @@ -1084,6 +1091,7 @@ impl TriggerRepo for PostgresTriggerRepo { id: parent.id.into(), app_id: parent.app_id.into(), script_id: parent.script_id.into(), + name: parent.name.clone(), kind: TriggerKind::Pubsub, enabled: parent.enabled, dispatch_mode: dispatch_from_str(&parent.dispatch_mode), @@ -1116,7 +1124,7 @@ impl TriggerRepo for PostgresTriggerRepo { retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal \ ) VALUES ($1, $2, 'email', TRUE, 'async', 3, 'exponential', 1000, $3) \ - RETURNING id, app_id, script_id, kind, enabled, dispatch_mode, \ + RETURNING id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at", ) @@ -1143,6 +1151,7 @@ impl TriggerRepo for PostgresTriggerRepo { id: parent.id.into(), app_id: parent.app_id.into(), script_id: parent.script_id.into(), + name: parent.name.clone(), kind: TriggerKind::Email, enabled: parent.enabled, dispatch_mode: dispatch_from_str(&parent.dispatch_mode), @@ -1185,7 +1194,7 @@ impl TriggerRepo for PostgresTriggerRepo { async fn list_for_app(&self, app_id: AppId) -> Result, TriggerRepoError> { let parents: Vec = sqlx::query_as( - "SELECT id, app_id, script_id, kind, enabled, dispatch_mode, \ + "SELECT id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at \ FROM triggers WHERE app_id = $1 ORDER BY created_at DESC", @@ -1213,7 +1222,7 @@ impl TriggerRepo for PostgresTriggerRepo { async fn get(&self, id: TriggerId) -> Result, TriggerRepoError> { let parent: Option = sqlx::query_as( - "SELECT id, app_id, script_id, kind, enabled, dispatch_mode, \ + "SELECT id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at \ FROM triggers WHERE id = $1", @@ -1463,7 +1472,7 @@ impl TriggerRepo for PostgresTriggerRepo { retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal \ ) VALUES ($1, $2, 'queue', TRUE, $3, $4, $5, $6, $7) \ - RETURNING id, app_id, script_id, kind, enabled, dispatch_mode, \ + RETURNING id, app_id, script_id, name, kind, enabled, dispatch_mode, \ retry_max_attempts, retry_backoff, retry_base_ms, \ registered_by_principal, created_at, updated_at", ) @@ -1494,6 +1503,7 @@ impl TriggerRepo for PostgresTriggerRepo { id: parent.id.into(), app_id: parent.app_id.into(), script_id: parent.script_id.into(), + name: parent.name.clone(), kind: TriggerKind::Queue, enabled: parent.enabled, dispatch_mode: dispatch_from_str(&parent.dispatch_mode), @@ -1700,6 +1710,7 @@ async fn hydrate_one(pool: &PgPool, parent: TriggerRow) -> Result