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