Skip to content
Snippets Groups Projects
Commit b6e361bd authored by Gomez Goiri, Aitor's avatar Gomez Goiri, Aitor
Browse files

Enhancing understandability by adding methods to RawStats struct

parent 8cda676c
No related branches found
No related tags found
No related merge requests found
......@@ -81,7 +81,7 @@ func ContextOperations(m shared.AbstractChaincodeOperationManager) error {
middleware.InjectAssetOwnerData,
},
[]shared.MiddlewareInterface{
m2.UpdateStats,
m2.UpdateSlagStats,
},
assetController.SaveAbstractAsset,
).
......
......@@ -29,22 +29,22 @@ func GetStatsOperation(stub shared.LedgerBuildrStubInterface, request shared.Led
return api.NewApiResponsePtr(fnName, err, nil).SendResponse()
}
globalStat, err := GetStats(stub, GLOBAL_KEY)
globalStat, err := getStats(stub, GLOBAL_KEY)
if err != nil {
return api.NewApiResponsePtr(fnName, err, nil).SendResponse()
}
ret.GlobalStats = *model.RefineStats(globalStat)
ret.GlobalStats = *globalStat.RefineStats()
if len(*orgs) > 0 {
ret.PerCompany = make(map[string]model.Stats)
}
for _, org := range *orgs {
orgStat, err := GetStats(stub, org)
orgStat, err := getStats(stub, org)
if err != nil {
return api.NewApiResponsePtr(fnName, err, nil).SendResponse()
}
ret.PerCompany[org] = *model.RefineStats(orgStat)
ret.PerCompany[org] = *orgStat.RefineStats()
}
return api.NewAPIGenericResponsePtr(fnName, nil, ret).SendResponse()
......
......@@ -19,7 +19,7 @@ const ORG_LIST_KEY = "org_list"
type OrgList []string
func GetStats(stub shared.LedgerBuildrStubInterface, key string) (st *model.RawStats, err error) {
func getStats(stub shared.LedgerBuildrStubInterface, key string) (st *model.RawStats, err error) {
value, err := stub.GetState(key)
if err != nil || len(value) == 0 {
st = new(model.RawStats)
......@@ -33,7 +33,7 @@ func GetStats(stub shared.LedgerBuildrStubInterface, key string) (st *model.RawS
return st, nil
}
func PutStats(stub shared.LedgerBuildrStubInterface, key string, stats *model.RawStats) (error) {
func putStats(stub shared.LedgerBuildrStubInterface, key string, stats *model.RawStats) (error) {
serialized, err := json.Marshal(stats)
if err != nil {
return err
......@@ -92,3 +92,47 @@ func AddOrgIfNotExist(stub shared.LedgerBuildrStubInterface, org string) (err er
return nil
}
func RetrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawStats, *model.RawStats, error) {
org, err := stub.GetOrganization()
if err != nil {
return nil, nil, err
}
customStats, err := getStats(stub, org)
if err != nil {
return nil, nil, err
}
globalStats, err := getStats(stub , GLOBAL_KEY)
if err != nil {
return nil, nil, err
}
return globalStats, customStats, nil
}
func UpgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawStats, customStats *model.RawStats) (error) {
org, err := stub.GetOrganization()
if err != nil {
return err
}
err = putStats(stub, org, customStats)
if err != nil {
return err
}
err = putStats(stub, GLOBAL_KEY, globalStats)
if err != nil {
return err
}
err = AddOrgIfNotExist(stub, org)
if err != nil {
return err
}
return nil
}
\ No newline at end of file
......@@ -8,59 +8,14 @@ package middleware
import (
"git.code.tecnalia.com/blockchain/hypercog/controller/stats"
"git.code.tecnalia.com/blockchain/hypercog/model"
"git.code.tecnalia.com/ledgerbuilder/sdk/shared"
"git.code.tecnalia.com/traceblock/sdk/middleware"
)
var (
UpdateStats = shared.NewMiddlewareFunction("update-stats-slag", _updateSlagProduction)
UpdateSlagStats = shared.NewMiddlewareFunction("update-stats-slag", _updateSlagProduction)
)
func _retrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawStats, *model.RawStats, error) {
org, err := stub.GetOrganization()
if err != nil {
return nil, nil, err
}
customStats, err := stats.GetStats(stub, org)
if err != nil {
return nil, nil, err
}
globalStats, err := stats.GetStats(stub , stats.GLOBAL_KEY)
if err != nil {
return nil, nil, err
}
return globalStats, customStats, nil
}
func _upgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawStats, customStats *model.RawStats) (error) {
org, err := stub.GetOrganization()
if err != nil {
return err
}
err = stats.PutStats(stub, org, customStats)
if err != nil {
return err
}
err = stats.PutStats(stub, stats.GLOBAL_KEY, globalStats)
if err != nil {
return err
}
err = stats.AddOrgIfNotExist(stub, org)
if err != nil {
return err
}
return nil
}
func _updateSlagProduction(stub shared.LedgerBuildrStubInterface, ctl shared.ControllerInterface, req shared.TXRequestInterface, requestAsset shared.LedgerBuildrAsset) (shared.LedgerBuildrAsset, error) {
asst, err := middleware.ConvertToTraceableAsset(requestAsset)
if err != nil {
......@@ -69,20 +24,15 @@ func _updateSlagProduction(stub shared.LedgerBuildrStubInterface, ctl shared.Con
status, ok := asst.Get("status")
if ok && status == "slag" {
globalStats, customStats, err := _retrieveExistingStats(stub)
globalStats, customStats, err := stats.RetrieveExistingStats(stub)
if err != nil {
return nil, err
}
amount := float64(asst.Quantity)
if asst.Units == "kg" {
amount /= 1000.0
}
customStats.TotalSlag += amount
globalStats.TotalSlag += amount
customStats.RegisterSlag(asst.Quantity, asst.Units)
globalStats.RegisterSlag(asst.Quantity, asst.Units)
err = _upgradeStats(stub, globalStats, customStats)
err = stats.UpgradeStats(stub, globalStats, customStats)
if err != nil {
return nil, err
}
......
......@@ -38,7 +38,34 @@ type RawStats struct {
MaxPrice float64 `json:"maxPrice"` // in €
}
func RefineStats(raw *RawStats) (*Stats) {
func toTons(quantity uint32, units string) (float64) {
amount := float64(quantity)
if units == "kg" {
amount /= 1000.0
}
return amount
}
func (raw *RawStats) RegisterSlag(quantity uint32, units string) {
raw.TotalSlag += toTons(quantity, units)
}
func (raw *RawStats) UpgradeSell(quantity uint32, price float32, units string) {
raw.SlagReused += toTons(quantity, units)
raw.TotalPrice += float64(price)
raw.BidAmount += 1
convertedPrice := float64(price)
if convertedPrice < raw.MinPrice {
raw.MinPrice = convertedPrice
}
if raw.MaxPrice < convertedPrice {
raw.MaxPrice = convertedPrice
}
}
func (raw *RawStats) RefineStats() (*Stats) {
ret := new(Stats)
ret.TotalSlag = raw.TotalSlag
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment