69 lines
2.6 KiB
Go
69 lines
2.6 KiB
Go
package handoff
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
type ARIClient interface {
|
|
RedirectChannel(ctx context.Context, channelID string, endpoint string) error
|
|
ContinueInDialplan(ctx context.Context, channelID, dialplanContext, extension string, priority int) error
|
|
}
|
|
|
|
type Executor interface {
|
|
Execute(ctx context.Context, req HandoffRequest) (HandoffResult, error)
|
|
}
|
|
|
|
type SafeExecutor struct {
|
|
ARI ARIClient
|
|
}
|
|
|
|
func (e SafeExecutor) Execute(ctx context.Context, req HandoffRequest) (HandoffResult, error) {
|
|
result := HandoffResult{RequestID: req.ID, Mode: req.Mode}
|
|
switch req.Mode {
|
|
case HandoffModeDisabledStub:
|
|
result.Status = HandoffStatusStubbed
|
|
result.MessageKey = "handoff.stub"
|
|
result.Message = Message(result.MessageKey, req.Language)
|
|
return result, nil
|
|
case HandoffModeHangupAfterMessage:
|
|
result.Status = HandoffStatusCompleted
|
|
result.MessageKey = "handoff.stub"
|
|
result.Message = Message(result.MessageKey, req.Language)
|
|
return result, nil
|
|
case HandoffModeARIRedirect:
|
|
result.TransferAttempted = true
|
|
if e.ARI == nil {
|
|
return transferFailed(req, "ari client not configured")
|
|
}
|
|
if err := e.ARI.RedirectChannel(ctx, req.AsteriskChannelID, req.TargetEndpoint); err != nil {
|
|
return transferFailed(req, err.Error())
|
|
}
|
|
result.Status = HandoffStatusCompleted
|
|
result.TransferSucceeded = true
|
|
result.MessageKey = "handoff.transfer_started"
|
|
result.Message = Message(result.MessageKey, req.Language)
|
|
return result, nil
|
|
case HandoffModeDialplanContinue:
|
|
result.TransferAttempted = true
|
|
if e.ARI == nil {
|
|
return transferFailed(req, "ari client not configured")
|
|
}
|
|
if err := e.ARI.ContinueInDialplan(ctx, req.AsteriskChannelID, req.DialplanContext, req.DialplanExtension, req.DialplanPriority); err != nil {
|
|
return transferFailed(req, err.Error())
|
|
}
|
|
result.Status = HandoffStatusCompleted
|
|
result.TransferSucceeded = true
|
|
result.MessageKey = "handoff.transfer_started"
|
|
result.Message = Message(result.MessageKey, req.Language)
|
|
return result, nil
|
|
default:
|
|
return HandoffResult{RequestID: req.ID, Mode: req.Mode, Status: HandoffStatusFailed, MessageKey: "handoff.denied", Message: Message("handoff.denied", req.Language), Error: "unknown handoff mode"}, fmt.Errorf("unknown handoff mode")
|
|
}
|
|
}
|
|
|
|
func transferFailed(req HandoffRequest, msg string) (HandoffResult, error) {
|
|
result := HandoffResult{RequestID: req.ID, Mode: req.Mode, Status: HandoffStatusFailed, TransferAttempted: true, MessageKey: "handoff.transfer_failed", Message: Message("handoff.transfer_failed", req.Language), Error: SanitizeText(msg, 200)}
|
|
return result, fmt.Errorf("handoff transfer failed")
|
|
}
|