From ba2665a9a81ee59319f4ba1b3bebb206ef585722 Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Sun, 16 Jun 2013 23:26:30 +0300 Subject: [PATCH] more API methods, docs pending --- apier/tpdestinations.go | 92 +++++++++++++++++++++++++++-------------- rater/action_timing.go | 24 +++++------ 2 files changed, 73 insertions(+), 43 deletions(-) diff --git a/apier/tpdestinations.go b/apier/tpdestinations.go index 1f8f47d50..3b0188e15 100644 --- a/apier/tpdestinations.go +++ b/apier/tpdestinations.go @@ -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 } diff --git a/rater/action_timing.go b/rater/action_timing.go index 3e9c83843..c98774c6e 100644 --- a/rater/action_timing.go +++ b/rater/action_timing.go @@ -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)