Skip to content

Commit 3c6b6e2

Browse files
author
anandrgitnirman
authored
Merge pull request #551 from anandrgitnirman/master
#542 store fixed price details at the time of license creation
2 parents eaf5ca2 + b6e2b0a commit 3c6b6e2

File tree

4 files changed

+47
-9
lines changed

4 files changed

+47
-9
lines changed

license_server/license_service.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,42 @@ type LockingLicenseService struct {
1212
LicenseDetailsStorage storage.TypedAtomicStorage
1313
LicenseUsageStorage storage.TypedAtomicStorage
1414
Org *blockchain.OrganizationMetaData
15+
ServiceMetaData *blockchain.ServiceMetadata
1516
}
1617

1718
//Will be used in the components to create a new instance of LicenseService
1819
func NewLicenseService(
1920
detailsStorage storage.TypedAtomicStorage,
2021
licenseStorage storage.TypedAtomicStorage, orgData *blockchain.OrganizationMetaData,
21-
) *LockingLicenseService {
22+
serviceMetaData *blockchain.ServiceMetadata) *LockingLicenseService {
2223
return &LockingLicenseService{
2324
LicenseDetailsStorage: detailsStorage,
2425
LicenseUsageStorage: licenseStorage,
2526
Org: orgData,
27+
ServiceMetaData: serviceMetaData,
2628
}
2729
}
2830

31+
func (h *LockingLicenseService) CreateLicenseDetails(channelId *big.Int, serviceId string,
32+
license License) (err error) {
33+
key := LicenseDetailsKey{ServiceID: serviceId, ChannelID: channelId}
34+
//Get the associated fixed Pricing details
35+
fixedPricingDetails, err := h.getFixedPriceFromServiceMetadata(license)
36+
if err != nil {
37+
return err
38+
}
39+
data := LicenseDetailsData{License: license, FixedPricing: fixedPricingDetails}
40+
return h.LicenseDetailsStorage.Put(key, data)
41+
}
42+
43+
func (h *LockingLicenseService) getFixedPriceFromServiceMetadata(license License) (fixedPricingDetails ServiceMethodCostDetails, err error) {
44+
fixedPricingDetails = ServiceMethodCostDetails{}
45+
serviceMetadata := h.ServiceMetaData
46+
fixedPricingDetails.Price = serviceMetadata.GetDefaultPricing().PriceInCogs
47+
fixedPricingDetails.PlanName = serviceMetadata.GetDefaultPricing().PriceModel
48+
return
49+
}
50+
2951
func (h *LockingLicenseService) CreateOrUpdateLicense(channelId *big.Int, serviceId string) (err error) {
3052
return h.UpdateLicenseUsage(channelId, serviceId, nil, PLANNED, SUBSCRIPTION)
3153
}

license_server/license_service_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@ type LicenseServiceTestSuite struct {
1717
licenseDetailsStorage storage.TypedAtomicStorage
1818
licenseUsageStorage storage.TypedAtomicStorage
1919
orgMetaData *blockchain.OrganizationMetaData
20+
servMetaData *blockchain.ServiceMetadata
2021
channelID *big.Int
2122
}
2223

2324
func (suite *LicenseServiceTestSuite) SetupSuite() {
2425
suite.channelID = big.NewInt(1)
2526
suite.orgMetaData, _ = blockchain.InitOrganizationMetaDataFromJson(testJsonOrgGroupData)
27+
suite.servMetaData, _ = blockchain.ReadServiceMetaDataFromLocalFile("../service_metadata.json")
2628
suite.licenseDetailsStorage = NewLicenseDetailsStorage(storage.NewMemStorage())
2729
suite.licenseUsageStorage = NewLicenseUsageTrackerStorage(storage.NewMemStorage())
28-
suite.service = NewLicenseService(suite.licenseDetailsStorage, suite.licenseUsageStorage, suite.orgMetaData)
30+
suite.service = NewLicenseService(suite.licenseDetailsStorage, suite.licenseUsageStorage, suite.orgMetaData,
31+
suite.servMetaData)
2932
}
3033
func TestTokenServiceTestSuite(t *testing.T) {
3134
suite.Run(t, new(LicenseServiceTestSuite))

license_server/license_storage.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ func serializeLicenseDetailsKey(key interface{}) (serialized string, err error)
6262

6363
type LicenseDetailsData struct {
6464
License License
65+
//This is to capture the fixed price at the time of purchasing the license
66+
//If there is no Dynamic Pricing involved , we will need to fall back on the fixed price
67+
//that is available
68+
// Keep this flexible to ensure we also support method level pricing in to the future
69+
FixedPricing ServiceMethodCostDetails
6570
}
6671
type LicenseUsageTrackerKey struct {
6772
ChannelID *big.Int
@@ -102,6 +107,7 @@ type Usage interface {
102107
}
103108

104109
type License interface {
110+
GetName() string
105111
GetType() string
106112
IsActive() bool
107113
IsCallEligible() (bool, error)
@@ -206,14 +212,14 @@ type Tier struct {
206212
AuthorizedAddresses []string
207213
}
208214

209-
type ServiceMethodDetails struct {
215+
type ServiceMethodCostDetails struct {
210216
PlanName string
211217
ServiceName string
212218
MethodName string
213219
Price *big.Int
214220
}
215221

216-
func (s ServiceMethodDetails) String() string {
222+
func (s ServiceMethodCostDetails) String() string {
217223
return fmt.Sprintf("{Valididty:%v,Details:%v,Discount:%v}",
218224
s.PlanName, s.ServiceName, s.MethodName)
219225
}
@@ -248,16 +254,20 @@ type PricingDetails struct {
248254
PlanName string
249255
ValidityInDays uint8
250256
ActualAmountSigned *big.Int
251-
ServiceMethodDetails *ServiceMethodDetails //If this is null , implies it applies to all methods of the Service or just the one defined here
257+
ServiceMethodDetails *ServiceMethodCostDetails //If this is null , implies it applies to all methods of the Service or just the one defined here
252258
}
253259

254260
func (s PricingDetails) String() string {
255261
return fmt.Sprintf("{CreditsInCogs:%v,FeeInCogs:%v,PlanName:%v"+
256-
",ValidityInDays:%v,ActualAmountSigned:%v,ServiceMethodDetails:%v}",
262+
",ValidityInDays:%v,ActualAmountSigned:%v,ServiceMethodCostDetails:%v}",
257263
s.CreditsInCogs, s.FeeInCogs, s.PlanName, s.ValidityInDays, s.ActualAmountSigned,
258264
s.ServiceMethodDetails)
259265
}
260266

267+
func (s Subscription) GetName() string {
268+
return s.GetName()
269+
}
270+
261271
func (s Subscription) ValidFrom() time.Time {
262272
return s.Validity.StartTimeUTC
263273
}
@@ -294,6 +304,9 @@ func (s Subscription) String() string {
294304
s.Validity.String(), s.Details.String(), s.Discount.String())
295305
}
296306

307+
func (s Tier) GetName() string {
308+
return s.GetName()
309+
}
297310
func (s Tier) GetType() string {
298311
return TIER
299312
}
@@ -338,7 +351,7 @@ func serializeLicenseDetailsData(value interface{}) (slice string, err error) {
338351
gob.Register(&PricingDetails{})
339352
gob.Register(&TierPricingDetails{})
340353
gob.Register(&DiscountPercentage{})
341-
gob.Register(&ServiceMethodDetails{})
354+
gob.Register(&ServiceMethodCostDetails{})
342355

343356
err = e.Encode(value)
344357

@@ -356,7 +369,7 @@ func deserializeLicenseDetailsData(slice string, value interface{}) (err error)
356369
gob.Register(&PricingDetails{})
357370
gob.Register(&TierPricingDetails{})
358371
gob.Register(&DiscountPercentage{})
359-
gob.Register(&ServiceMethodDetails{})
372+
gob.Register(&ServiceMethodCostDetails{})
360373

361374
d := gob.NewDecoder(b)
362375
err = d.Decode(value)

license_server/license_storage_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func Test_serializeLicenseDetailsData(t *testing.T) {
4949
ValidityInDays: 120,
5050
FeeInCogs: big.NewInt(120),
5151
CreditsInCogs: big.NewInt(130),
52-
ServiceMethodDetails: &ServiceMethodDetails{MethodName: "M1", ServiceName: "S1"},
52+
ServiceMethodDetails: &ServiceMethodCostDetails{MethodName: "M1", ServiceName: "S1"},
5353
},
5454
}
5555
fmt.Println(license)

0 commit comments

Comments
 (0)