package main import ( "context" "net/http" "git.cin.su/m/Assistant/adapters/notificationexecutor" "git.cin.su/m/Assistant/contracts/capability" commitcontract "git.cin.su/m/Assistant/contracts/commit" "git.cin.su/m/Assistant/contracts/identity" "git.cin.su/m/Assistant/modules/commit/ports" ) type notificationBindingSource interface { ActiveCapabilityBinding(context.Context, capability.CapabilityID, identity.PrincipalID) (capability.Binding, error) CapabilityBinding(context.Context, capability.CapabilityBindingID, int64) (capability.Binding, error) } type operationDispatcher struct { continuityExecutor ports.Executor continuityReconciler ports.Reconciler bindings notificationBindingSource secretRef string secret string client *http.Client } func (d operationDispatcher) Execute(action commitcontract.AuthorizedAction) ports.ExecutionResult { if action.Proposal.Operation != commitcontract.OperationDeliverProspectiveNotification { return d.continuityExecutor.Execute(action) } subject := action.Proposal.NotificationSubject exact, err := d.bindings.CapabilityBinding(context.Background(), subject.BindingID, subject.BindingRevision) if err != nil || exact.SecretRef != d.secretRef { return ports.ExecutionResult{Known: true} } active, err := d.bindings.ActiveCapabilityBinding(context.Background(), action.Proposal.CapabilityID, action.PrincipalID) if err != nil || active != exact { return ports.ExecutionResult{Known: true} } executor, err := notificationexecutor.New(exact, d.secret, d.client) if err != nil { return ports.ExecutionResult{Known: true} } return executor.Execute(action) } func (d operationDispatcher) Reconcile(action commitcontract.AuthorizedAction) ports.ExecutionResult { if action.Proposal.Operation != commitcontract.OperationDeliverProspectiveNotification { return d.continuityReconciler.Reconcile(action) } subject := action.Proposal.NotificationSubject exact, err := d.bindings.CapabilityBinding(context.Background(), subject.BindingID, subject.BindingRevision) if err != nil || exact.SecretRef != d.secretRef { return ports.ExecutionResult{} } reconciler, err := notificationexecutor.NewReconciler(exact, d.secret, d.client) if err != nil { return ports.ExecutionResult{} } return reconciler.Reconcile(action) }