From b6e361bddf920be06e39ba8ba45899fa059bb83f Mon Sep 17 00:00:00 2001 From: "Gomez Goiri, Aitor" <aitor.gomez@tecnalia.com> Date: Wed, 2 Mar 2022 12:44:51 +0100 Subject: [PATCH] Enhancing understandability by adding methods to RawStats struct --- chaincode/controller/operations.go | 2 +- .../controller/stats/stats_controller.go | 8 +-- chaincode/controller/stats/stub.go | 48 +++++++++++++- chaincode/middleware/stats.go | 62 ++----------------- chaincode/model/stats.go | 29 ++++++++- 5 files changed, 85 insertions(+), 64 deletions(-) diff --git a/chaincode/controller/operations.go b/chaincode/controller/operations.go index 749ce6a..2b85031 100644 --- a/chaincode/controller/operations.go +++ b/chaincode/controller/operations.go @@ -81,7 +81,7 @@ func ContextOperations(m shared.AbstractChaincodeOperationManager) error { middleware.InjectAssetOwnerData, }, []shared.MiddlewareInterface{ - m2.UpdateStats, + m2.UpdateSlagStats, }, assetController.SaveAbstractAsset, ). diff --git a/chaincode/controller/stats/stats_controller.go b/chaincode/controller/stats/stats_controller.go index e0c531a..8e8d25c 100644 --- a/chaincode/controller/stats/stats_controller.go +++ b/chaincode/controller/stats/stats_controller.go @@ -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() diff --git a/chaincode/controller/stats/stub.go b/chaincode/controller/stats/stub.go index 94b2ee4..be2689c 100644 --- a/chaincode/controller/stats/stub.go +++ b/chaincode/controller/stats/stub.go @@ -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 @@ -90,5 +90,49 @@ 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 diff --git a/chaincode/middleware/stats.go b/chaincode/middleware/stats.go index 5dc9fb8..6b62c81 100644 --- a/chaincode/middleware/stats.go +++ b/chaincode/middleware/stats.go @@ -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,24 +24,19 @@ 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 } } return asst, nil -} \ No newline at end of file +} diff --git a/chaincode/model/stats.go b/chaincode/model/stats.go index ec9739f..75f302f 100644 --- a/chaincode/model/stats.go +++ b/chaincode/model/stats.go @@ -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 -- GitLab