more API methods, docs pending

This commit is contained in:
Radu Ioan Fericean
2013-06-16 23:26:30 +03:00
parent 74b7836937
commit ba2665a9a8
2 changed files with 73 additions and 43 deletions

View File

@@ -61,43 +61,19 @@ func (self *Apier) SetDestination(dest *rater.Destination, reply *rater.Destinat
return nil
}
type AttrBalance struct {
type AttrGetBalance struct {
Account string
BalanceId string
Direction string
}
func (self *Apier) GetMoneyBalance(attr *AttrBalance, reply *float64) (err error) {
err = self.getBalance(attr, rater.CREDIT, reply)
return err
}
func (self *Apier) GetSMSBalance(attr *AttrBalance, reply *float64) (err error) {
err = self.getBalance(attr, rater.SMS, reply)
return err
}
func (self *Apier) GetInternetBalance(attr *AttrBalance, reply *float64) (err error) {
err = self.getBalance(attr, rater.TRAFFIC, reply)
return err
}
func (self *Apier) GetInternetTimeBalance(attr *AttrBalance, reply *float64) (err error) {
err = self.getBalance(attr, rater.TRAFFIC_TIME, reply)
return err
}
func (self *Apier) GetMinutesBalance(attr *AttrBalance, reply *float64) (err error) {
err = self.getBalance(attr, rater.MINUTES, reply)
return err
}
// Get balance
func (self *Apier) getBalance(attr *AttrBalance, balanceId string, reply *float64) (err error) {
func (self *Apier) GetBalance(attr *AttrGetBalance, reply *float64) error {
userBalance, err := self.StorDb.GetUserBalance(attr.Account)
if err != nil {
return err
}
if balance, balExists := userBalance.BalanceMap[balanceId+attr.Direction]; !balExists {
if balance, balExists := userBalance.BalanceMap[attr.BalanceId+attr.Direction]; !balExists {
// No match, balanceId not found
return errors.New(utils.ERR_NOT_FOUND)
} else {
@@ -106,7 +82,63 @@ func (self *Apier) getBalance(attr *AttrBalance, balanceId string, reply *float6
return nil
}
func (self *Apier) AddTimedAction(attr *AttrBalance, reply *float64) (err error) {
err = self.getBalance(attr, rater.MINUTES, reply)
type AttrAddBalance struct {
Account string
BalanceId string
Direction string
Value float64
}
func (self *Apier) AddBalance(attr *AttrAddBalance, reply *float64) error {
// what storage instance do we use?
at := &rater.ActionTiming{
UserBalanceIds: []string{attr.Account},
}
at.SetActions(rater.Actions{&rater.Action{BalanceId: attr.BalanceId, Direction: attr.Direction, Units: attr.Value}})
if err := at.Execute(); err != nil {
return err
}
// what to put in replay?
return nil
}
type AttrExecuteAction struct {
Account string
BalanceId string
ActionsId string
}
func (self *Apier) ExecuteAction(attr *AttrExecuteAction, reply *float64) error {
at := &rater.ActionTiming{
UserBalanceIds: []string{attr.Account},
ActionsId: attr.ActionsId,
}
if err := at.Execute(); err != nil {
return err
}
// what to put in replay
return nil
}
type AttrSetRatingProfile struct {
Subject string
RatingProfileId string
}
func (self *Apier) SetRatingProfile(attr *AttrSetRatingProfile, reply *float64) error {
subject, err := self.StorDb.GetRatingProfile(attr.Subject)
if err != nil {
return err
}
rp, err := self.StorDb.GetRatingProfile(attr.RatingProfileId)
if err != nil {
return err
}
subject.DestinationMap = rp.DestinationMap
err = self.StorDb.SetRatingProfile(subject)
return err
}

View File

@@ -186,6 +186,10 @@ func (at *ActionTiming) resetStartTimeCache() {
at.stCache = time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC)
}
func (at *ActionTiming) SetActions(as Actions) {
at.actions = as
}
func (at *ActionTiming) getActions() (as []*Action, err error) {
if at.actions == nil {
at.actions, err = storageGetter.GetActions(at.ActionsId)
@@ -194,17 +198,6 @@ func (at *ActionTiming) getActions() (as []*Action, err error) {
return at.actions, err
}
func (at *ActionTiming) getUserBalances() (ubs []*UserBalance) {
for _, ubId := range at.UserBalanceIds {
ub, err := storageGetter.GetUserBalance(ubId)
if err != nil {
Logger.Warning(fmt.Sprintf("Could not get user balances for this id: %s. Skipping!", ubId))
}
ubs = append(ubs, ub)
}
return
}
func (at *ActionTiming) Execute() (err error) {
at.resetStartTimeCache()
aac, err := at.getActions()
@@ -218,8 +211,13 @@ func (at *ActionTiming) Execute() (err error) {
Logger.Crit(fmt.Sprintf("Function type %v not available, aborting execution!", a.ActionType))
return
}
for _, ub := range at.getUserBalances() {
AccLock.Guard(ub.Id, func() (float64, error) {
for _, ubId := range at.UserBalanceIds {
AccLock.Guard(ubId, func() (float64, error) {
ub, err := storageGetter.GetUserBalance(ubId)
if err != nil {
Logger.Warning(fmt.Sprintf("Could not get user balances for this id: %s. Skipping!", ubId))
}
Logger.Info(fmt.Sprintf("Executing %v on %v", a.ActionType, ub.Id))
err = actionFunction(ub, a)
storageGetter.SetUserBalance(ub)