@@ -25,7 +25,7 @@ import (
25
25
)
26
26
27
27
const (
28
- ListingVersion = 3
28
+ ListingVersion = 4
29
29
TitleMaxCharacters = 140
30
30
ShortDescriptionLength = 160
31
31
DescriptionMaxCharacters = 50000
@@ -43,13 +43,18 @@ const (
43
43
MaxCountryCodes = 255
44
44
EscrowTimeout = 1080
45
45
SlugBuffer = 5
46
+ PriceModifierMin = - 99.99
47
+ PriceModifierMax = 1000.00
46
48
47
49
DefaultCoinDivisibility uint32 = 1e8
50
+
51
+ priceModifierListingVersion = 4
48
52
)
49
53
50
54
type price struct {
51
- CurrencyCode string `json:"currencyCode"`
52
- Amount uint64 `json:"amount"`
55
+ CurrencyCode string `json:"currencyCode"`
56
+ Amount uint64 `json:"amount"`
57
+ Modifier float32 `json:"modifier"`
53
58
}
54
59
type thumbnail struct {
55
60
Tiny string `json:"tiny"`
@@ -146,7 +151,7 @@ func (n *OpenBazaarNode) SignListing(listing *pb.Listing) (*pb.SignedListing, er
146
151
}
147
152
148
153
// Set listing version
149
- listing .Metadata .Version = ListingVersion
154
+ listing .Metadata .Version = versionForNewListing ( listing )
150
155
151
156
// Add the vendor ID to the listing
152
157
id := new (pb.ID )
@@ -442,16 +447,20 @@ func (n *OpenBazaarNode) extractListingData(listing *pb.SignedListing) (ListingD
442
447
}
443
448
444
449
ld := ListingData {
445
- Hash : listingHash ,
446
- Slug : listing .Listing .Slug ,
447
- Title : listing .Listing .Item .Title ,
448
- Categories : listing .Listing .Item .Categories ,
449
- NSFW : listing .Listing .Item .Nsfw ,
450
- CoinType : listing .Listing .Metadata .CoinType ,
451
- ContractType : listing .Listing .Metadata .ContractType .String (),
452
- Description : listing .Listing .Item .Description [:descriptionLength ],
453
- Thumbnail : thumbnail {listing .Listing .Item .Images [0 ].Tiny , listing .Listing .Item .Images [0 ].Small , listing .Listing .Item .Images [0 ].Medium },
454
- Price : price {listing .Listing .Metadata .PricingCurrency , listing .Listing .Item .Price },
450
+ Hash : listingHash ,
451
+ Slug : listing .Listing .Slug ,
452
+ Title : listing .Listing .Item .Title ,
453
+ Categories : listing .Listing .Item .Categories ,
454
+ NSFW : listing .Listing .Item .Nsfw ,
455
+ CoinType : listing .Listing .Metadata .CoinType ,
456
+ ContractType : listing .Listing .Metadata .ContractType .String (),
457
+ Description : listing .Listing .Item .Description [:descriptionLength ],
458
+ Thumbnail : thumbnail {listing .Listing .Item .Images [0 ].Tiny , listing .Listing .Item .Images [0 ].Small , listing .Listing .Item .Images [0 ].Medium },
459
+ Price : price {
460
+ CurrencyCode : listing .Listing .Metadata .PricingCurrency ,
461
+ Amount : listing .Listing .Item .Price ,
462
+ Modifier : listing .Listing .Metadata .PriceModifier ,
463
+ },
455
464
ShipsTo : shipsTo ,
456
465
FreeShipping : freeShipping ,
457
466
Language : listing .Listing .Metadata .Language ,
@@ -1246,6 +1255,18 @@ func validateMarketPriceListing(listing *pb.Listing) error {
1246
1255
return ErrMarketPriceListingIllegalField ("item.price" )
1247
1256
}
1248
1257
1258
+ if listing .Metadata .PriceModifier != 0 {
1259
+ listing .Metadata .PriceModifier = float32 (int (listing .Metadata .PriceModifier * 100.0 )) / 100.0
1260
+ }
1261
+
1262
+ if listing .Metadata .PriceModifier < PriceModifierMin ||
1263
+ listing .Metadata .PriceModifier > PriceModifierMax {
1264
+ return ErrPriceModifierOutOfRange {
1265
+ Min : PriceModifierMin ,
1266
+ Max : PriceModifierMax ,
1267
+ }
1268
+ }
1269
+
1249
1270
return nil
1250
1271
}
1251
1272
@@ -1293,3 +1314,14 @@ func verifySignaturesOnListing(sl *pb.SignedListing) error {
1293
1314
}
1294
1315
return nil
1295
1316
}
1317
+
1318
+ func versionForNewListing (listing * pb.Listing ) uint32 {
1319
+ // Don't use newer version number of the listing doesn't have new features
1320
+ if ListingVersion == priceModifierListingVersion &&
1321
+ listing .Metadata .Format == pb .Listing_Metadata_MARKET_PRICE &&
1322
+ listing .Metadata .PriceModifier != 0 {
1323
+ return priceModifierListingVersion - 1
1324
+ }
1325
+
1326
+ return ListingVersion
1327
+ }
0 commit comments