unified Set and Update Aliases

fixes #301
This commit is contained in:
Radu Ioan Fericean
2015-11-30 22:00:05 +02:00
parent fd40b64f02
commit d8d1ce2efc
2 changed files with 98 additions and 90 deletions

View File

@@ -167,62 +167,58 @@ func NewAliasHandler(accountingDb AccountingStorage) *AliasHandler {
}
}
func (am *AliasHandler) SetAlias(al *Alias, reply *string) error {
am.mu.Lock()
defer am.mu.Unlock()
if err := am.accountingDb.SetAlias(al); err != nil {
*reply = err.Error()
return err
} //add to cache
aliasesChanged := []string{utils.ALIASES_PREFIX + al.GetId()}
if err := am.accountingDb.CacheAccountingPrefixValues(map[string][]string{utils.ALIASES_PREFIX: aliasesChanged}); err != nil {
return utils.NewErrServerError(err)
}
*reply = utils.OK
return nil
type AttrAddAlias struct {
Alias *Alias
Overwrite bool
}
func (am *AliasHandler) UpdateAlias(al *Alias, reply *string) error {
func (am *AliasHandler) SetAlias(attr *AttrAddAlias, reply *string) error {
am.mu.Lock()
defer am.mu.Unlock()
// get previous value
oldAlias, err := am.accountingDb.GetAlias(al.GetId(), false)
if err != nil {
return err
var oldAlias *Alias
if !attr.Overwrite { // get previous value
oldAlias, _ = am.accountingDb.GetAlias(attr.Alias.GetId(), false)
}
for _, value := range al.Values {
found := false
if value.DestinationId == "" {
value.DestinationId = utils.ANY
if attr.Overwrite || oldAlias == nil {
if err := am.accountingDb.SetAlias(attr.Alias); err != nil {
*reply = err.Error()
return err
}
for _, oldValue := range oldAlias.Values {
if oldValue.DestinationId == value.DestinationId {
for target, origAliasMap := range value.Pairs {
for orig, alias := range origAliasMap {
if oldValue.Pairs[target] == nil {
oldValue.Pairs[target] = make(map[string]string)
} else {
for _, value := range attr.Alias.Values {
found := false
if value.DestinationId == "" {
value.DestinationId = utils.ANY
}
for _, oldValue := range oldAlias.Values {
if oldValue.DestinationId == value.DestinationId {
for target, origAliasMap := range value.Pairs {
for orig, alias := range origAliasMap {
if oldValue.Pairs[target] == nil {
oldValue.Pairs[target] = make(map[string]string)
}
oldValue.Pairs[target][orig] = alias
}
oldValue.Pairs[target][orig] = alias
}
oldValue.Weight = value.Weight
found = true
break
}
oldValue.Weight = value.Weight
found = true
break
}
if !found {
oldAlias.Values = append(oldAlias.Values, value)
}
}
if !found {
oldAlias.Values = append(oldAlias.Values, value)
if err := am.accountingDb.SetAlias(oldAlias); err != nil {
*reply = err.Error()
return err
}
}
if err := am.accountingDb.SetAlias(oldAlias); err != nil {
*reply = err.Error()
return err
} //add to cache
aliasesChanged := []string{utils.ALIASES_PREFIX + al.GetId()}
//add to cache
aliasesChanged := []string{utils.ALIASES_PREFIX + attr.Alias.GetId()}
if err := am.accountingDb.CacheAccountingPrefixValues(map[string][]string{utils.ALIASES_PREFIX: aliasesChanged}); err != nil {
return utils.NewErrServerError(err)
}

View File

@@ -47,18 +47,21 @@ func TestAliasesGetMatchingAlias(t *testing.T) {
func TestAliasesSetters(t *testing.T) {
var out string
if err := aliasService.Call("AliasesV1.SetAlias", &Alias{
Direction: "*out",
Tenant: "cgrates.org",
Category: "call",
Account: "set",
Subject: "set",
Context: "*rating",
Values: AliasValues{&AliasValue{
DestinationId: utils.ANY,
Pairs: AliasPairs{"Account": map[string]string{"1234": "1235"}},
Weight: 10,
}},
if err := aliasService.Call("AliasesV1.SetAlias", &AttrAddAlias{
Alias: &Alias{
Direction: "*out",
Tenant: "cgrates.org",
Category: "call",
Account: "set",
Subject: "set",
Context: "*rating",
Values: AliasValues{&AliasValue{
DestinationId: utils.ANY,
Pairs: AliasPairs{"Account": map[string]string{"1234": "1235"}},
Weight: 10,
}},
},
Overwrite: true,
}, &out); err != nil || out != utils.OK {
t.Error("Error setting alias: ", err, out)
}
@@ -74,18 +77,21 @@ func TestAliasesSetters(t *testing.T) {
t.Errorf("Error getting alias: %+v", r)
}
if err := aliasService.Call("AliasesV1.UpdateAlias", &Alias{
Direction: "*out",
Tenant: "cgrates.org",
Category: "call",
Account: "set",
Subject: "set",
Context: "*rating",
Values: AliasValues{&AliasValue{
DestinationId: utils.ANY,
Pairs: AliasPairs{"Subject": map[string]string{"1234": "1235"}},
Weight: 10,
}},
if err := aliasService.Call("AliasesV1.SetAlias", &AttrAddAlias{
Alias: &Alias{
Direction: "*out",
Tenant: "cgrates.org",
Category: "call",
Account: "set",
Subject: "set",
Context: "*rating",
Values: AliasValues{&AliasValue{
DestinationId: utils.ANY,
Pairs: AliasPairs{"Subject": map[string]string{"1234": "1235"}},
Weight: 10,
}},
},
Overwrite: false,
}, &out); err != nil || out != utils.OK {
t.Error("Error updateing alias: ", err, out)
}
@@ -103,18 +109,21 @@ func TestAliasesSetters(t *testing.T) {
r.Values[0].Pairs["Account"]["1234"] != "1235" {
t.Errorf("Error getting alias: %+v", r.Values[0])
}
if err := aliasService.Call("AliasesV1.UpdateAlias", &Alias{
Direction: "*out",
Tenant: "cgrates.org",
Category: "call",
Account: "set",
Subject: "set",
Context: "*rating",
Values: AliasValues{&AliasValue{
DestinationId: utils.ANY,
Pairs: AliasPairs{"Subject": map[string]string{"1111": "2222"}},
Weight: 10,
}},
if err := aliasService.Call("AliasesV1.SetAlias", &AttrAddAlias{
Alias: &Alias{
Direction: "*out",
Tenant: "cgrates.org",
Category: "call",
Account: "set",
Subject: "set",
Context: "*rating",
Values: AliasValues{&AliasValue{
DestinationId: utils.ANY,
Pairs: AliasPairs{"Subject": map[string]string{"1111": "2222"}},
Weight: 10,
}},
},
Overwrite: false,
}, &out); err != nil || out != utils.OK {
t.Error("Error updateing alias: ", err, out)
}
@@ -128,18 +137,21 @@ func TestAliasesSetters(t *testing.T) {
}, r); err != nil || len(r.Values) != 1 || len(r.Values[0].Pairs) != 2 || r.Values[0].Pairs["Subject"]["1111"] != "2222" {
t.Errorf("Error getting alias: %+v", r.Values[0].Pairs["Subject"])
}
if err := aliasService.Call("AliasesV1.UpdateAlias", &Alias{
Direction: "*out",
Tenant: "cgrates.org",
Category: "call",
Account: "set",
Subject: "set",
Context: "*rating",
Values: AliasValues{&AliasValue{
DestinationId: "NAT",
Pairs: AliasPairs{"Subject": map[string]string{"3333": "4444"}},
Weight: 10,
}},
if err := aliasService.Call("AliasesV1.SetAlias", &AttrAddAlias{
Alias: &Alias{
Direction: "*out",
Tenant: "cgrates.org",
Category: "call",
Account: "set",
Subject: "set",
Context: "*rating",
Values: AliasValues{&AliasValue{
DestinationId: "NAT",
Pairs: AliasPairs{"Subject": map[string]string{"3333": "4444"}},
Weight: 10,
}},
},
Overwrite: false,
}, &out); err != nil || out != utils.OK {
t.Error("Error updateing alias: ", err, out)
}