63 lines
2.3 KiB
Go
63 lines
2.3 KiB
Go
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)
|
|
}
|