Files

47 lines
1.7 KiB
Go

package handoff
type PolicyContext struct {
State string
Route string
HandoffEnabled bool
HandoffMode HandoffMode
AllowInTestRouteOnly bool
HasTarget bool
AlreadyRequested bool
}
type PolicyDecision struct {
Allowed bool
StubOnly bool
ReasonCode string
MessageKey string
}
func Authorize(ctx PolicyContext) PolicyDecision {
if ctx.State == "ENDED" {
return PolicyDecision{Allowed: false, ReasonCode: "call_ended", MessageKey: "handoff.denied"}
}
if ctx.AlreadyRequested || ctx.State == "HANDOFF" {
return PolicyDecision{Allowed: true, StubOnly: true, ReasonCode: "already_requested", MessageKey: "handoff.already_requested"}
}
if ctx.AllowInTestRouteOnly && ctx.Route != "test" {
return PolicyDecision{Allowed: true, StubOnly: true, ReasonCode: "test_route_only", MessageKey: "handoff.stub"}
}
if !ctx.HandoffEnabled {
return PolicyDecision{Allowed: true, StubOnly: true, ReasonCode: "disabled", MessageKey: "handoff.stub"}
}
switch ctx.HandoffMode {
case HandoffModeDisabledStub:
return PolicyDecision{Allowed: true, StubOnly: true, ReasonCode: "disabled", MessageKey: "handoff.stub"}
case HandoffModeHangupAfterMessage:
return PolicyDecision{Allowed: true, ReasonCode: "ok", MessageKey: "handoff.stub"}
case HandoffModeARIRedirect, HandoffModeDialplanContinue:
if !ctx.HasTarget {
return PolicyDecision{Allowed: true, StubOnly: true, ReasonCode: "not_configured", MessageKey: "handoff.not_configured"}
}
return PolicyDecision{Allowed: true, ReasonCode: "ok", MessageKey: "handoff.transfer_started"}
default:
return PolicyDecision{Allowed: false, ReasonCode: "unknown_mode", MessageKey: "handoff.denied"}
}
}