From 1000c5e1e58d0a121b67d50cd743eb3487535a89 Mon Sep 17 00:00:00 2001 From: Daniel F Date: Tue, 11 Jul 2023 20:51:34 +0100 Subject: [PATCH] Updated services, split into strategy pattern for each kind of update --- go/api/controllers/item_controller_test.go | 1 - go/services/aged_brie_item_update_service.go | 71 +++++++++++++++++++ .../backstage_pass_item_update_service.go | 71 +++++++++++++++++++ go/services/item_update_service_provider.go | 26 +++++-- ...rvice.go => normal_item_update_service.go} | 8 +-- go/services/services.go | 5 +- go/services/sulfuras_item_update_service.go | 71 +++++++++++++++++++ 7 files changed, 243 insertions(+), 10 deletions(-) create mode 100644 go/services/aged_brie_item_update_service.go create mode 100644 go/services/backstage_pass_item_update_service.go rename go/services/{item_update_service.go => normal_item_update_service.go} (89%) create mode 100644 go/services/sulfuras_item_update_service.go diff --git a/go/api/controllers/item_controller_test.go b/go/api/controllers/item_controller_test.go index 207e7906..358b797d 100644 --- a/go/api/controllers/item_controller_test.go +++ b/go/api/controllers/item_controller_test.go @@ -3,7 +3,6 @@ package controllers import ( "net/http" "net/http/httptest" - //"strings" "testing" "github.com/stretchr/testify/assert" diff --git a/go/services/aged_brie_item_update_service.go b/go/services/aged_brie_item_update_service.go new file mode 100644 index 00000000..e598ce32 --- /dev/null +++ b/go/services/aged_brie_item_update_service.go @@ -0,0 +1,71 @@ +package services + +import ( + "github.com/emilybache/gildedrose-refactoring-kata/lib" + "github.com/emilybache/gildedrose-refactoring-kata/models" +) + +type AgedBrieItemUpdateService struct { + logger lib.Logger +} + +func NewAgedBrieItemUpdateService(logger lib.Logger) AgedBrieItemUpdateService { + return AgedBrieItemUpdateService{ + logger: logger, + } +} + +func (this AgedBrieItemUpdateService) UpdateQuality(item *models.Item) error { + item.Mutex.Lock() + defer item.Mutex.Unlock() + + itemModel := item.Model + + if itemModel.Name != "Aged Brie" && itemModel.Name != "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.Quality > 0 { + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.Quality = itemModel.Quality - 1 + } + } + } else { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + if itemModel.Name == "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.SellIn < 11 { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + if itemModel.SellIn < 6 { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + } + } + } + + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.SellIn = itemModel.SellIn - 1 + } + + if itemModel.SellIn < 0 { + if itemModel.Name != "Aged Brie" { + if itemModel.Name != "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.Quality > 0 { + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.Quality = itemModel.Quality - 1 + } + } + } else { + itemModel.Quality = itemModel.Quality - itemModel.Quality + } + } else { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + } + + return nil +} diff --git a/go/services/backstage_pass_item_update_service.go b/go/services/backstage_pass_item_update_service.go new file mode 100644 index 00000000..910511d3 --- /dev/null +++ b/go/services/backstage_pass_item_update_service.go @@ -0,0 +1,71 @@ +package services + +import ( + "github.com/emilybache/gildedrose-refactoring-kata/lib" + "github.com/emilybache/gildedrose-refactoring-kata/models" +) + +type BackstagePassItemUpdateService struct { + logger lib.Logger +} + +func NewBackstagePassItemUpdateService(logger lib.Logger) BackstagePassItemUpdateService { + return BackstagePassItemUpdateService{ + logger: logger, + } +} + +func (this BackstagePassItemUpdateService) UpdateQuality(item *models.Item) error { + item.Mutex.Lock() + defer item.Mutex.Unlock() + + itemModel := item.Model + + if itemModel.Name != "Aged Brie" && itemModel.Name != "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.Quality > 0 { + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.Quality = itemModel.Quality - 1 + } + } + } else { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + if itemModel.Name == "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.SellIn < 11 { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + if itemModel.SellIn < 6 { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + } + } + } + + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.SellIn = itemModel.SellIn - 1 + } + + if itemModel.SellIn < 0 { + if itemModel.Name != "Aged Brie" { + if itemModel.Name != "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.Quality > 0 { + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.Quality = itemModel.Quality - 1 + } + } + } else { + itemModel.Quality = itemModel.Quality - itemModel.Quality + } + } else { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + } + + return nil +} diff --git a/go/services/item_update_service_provider.go b/go/services/item_update_service_provider.go index 49d30d11..6dfd555a 100644 --- a/go/services/item_update_service_provider.go +++ b/go/services/item_update_service_provider.go @@ -8,20 +8,38 @@ import ( type ItemUpdateServiceProvider struct { logger lib.Logger - itemUpdateService ItemUpdateService + normalItemUpdateService NormalItemUpdateService + agedBrieItemUpdateService AgedBrieItemUpdateService + backstagePassItemUpdateService BackstagePassItemUpdateService + sulfurasItemUpdateService SulfurasItemUpdateService } func NewItemUpdateServiceProvider( logger lib.Logger, - itemUpdateService ItemUpdateService, + normalItemUpdateService NormalItemUpdateService, + agedBrieItemUpdateService AgedBrieItemUpdateService, + backstagePassItemUpdateService BackstagePassItemUpdateService, + sulfurasItemUpdateService SulfurasItemUpdateService, ) domains.ItemUpdateServiceProvider { return ItemUpdateServiceProvider{ logger: logger, - itemUpdateService: itemUpdateService, + normalItemUpdateService: normalItemUpdateService, + agedBrieItemUpdateService: agedBrieItemUpdateService, + backstagePassItemUpdateService: backstagePassItemUpdateService, + sulfurasItemUpdateService: sulfurasItemUpdateService, } } func (this ItemUpdateServiceProvider) GetUpdateService(item *models.Item) domains.ItemUpdateService { - return this.itemUpdateService + switch item.Model.Name { + case "Aged Brie": + return this.agedBrieItemUpdateService + case "Backstage passes to a TAFKAL80ETC concert": + return this.backstagePassItemUpdateService + case "Sulfuras, Hand of Ragnaros": + return this.sulfurasItemUpdateService + default: + return this.normalItemUpdateService + } } diff --git a/go/services/item_update_service.go b/go/services/normal_item_update_service.go similarity index 89% rename from go/services/item_update_service.go rename to go/services/normal_item_update_service.go index 9a5ad09a..b10430fc 100644 --- a/go/services/item_update_service.go +++ b/go/services/normal_item_update_service.go @@ -5,17 +5,17 @@ import ( "github.com/emilybache/gildedrose-refactoring-kata/models" ) -type ItemUpdateService struct { +type NormalItemUpdateService struct { logger lib.Logger } -func NewItemUpdateService(logger lib.Logger) ItemUpdateService { - return ItemUpdateService{ +func NewNormalItemUpdateService(logger lib.Logger) NormalItemUpdateService { + return NormalItemUpdateService{ logger: logger, } } -func (this ItemUpdateService) UpdateQuality(item *models.Item) error { +func (this NormalItemUpdateService) UpdateQuality(item *models.Item) error { item.Mutex.Lock() defer item.Mutex.Unlock() diff --git a/go/services/services.go b/go/services/services.go index 17ab9df4..f63117ef 100644 --- a/go/services/services.go +++ b/go/services/services.go @@ -3,6 +3,9 @@ package services import "go.uber.org/fx" var Module = fx.Options( - fx.Provide(NewItemUpdateService), + fx.Provide(NewNormalItemUpdateService), + fx.Provide(NewAgedBrieItemUpdateService), + fx.Provide(NewBackstagePassItemUpdateService), + fx.Provide(NewSulfurasItemUpdateService), fx.Provide(NewItemUpdateServiceProvider), ) diff --git a/go/services/sulfuras_item_update_service.go b/go/services/sulfuras_item_update_service.go new file mode 100644 index 00000000..9342f826 --- /dev/null +++ b/go/services/sulfuras_item_update_service.go @@ -0,0 +1,71 @@ +package services + +import ( + "github.com/emilybache/gildedrose-refactoring-kata/lib" + "github.com/emilybache/gildedrose-refactoring-kata/models" +) + +type SulfurasItemUpdateService struct { + logger lib.Logger +} + +func NewSulfurasItemUpdateService(logger lib.Logger) SulfurasItemUpdateService { + return SulfurasItemUpdateService{ + logger: logger, + } +} + +func (this SulfurasItemUpdateService) UpdateQuality(item *models.Item) error { + item.Mutex.Lock() + defer item.Mutex.Unlock() + + itemModel := item.Model + + if itemModel.Name != "Aged Brie" && itemModel.Name != "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.Quality > 0 { + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.Quality = itemModel.Quality - 1 + } + } + } else { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + if itemModel.Name == "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.SellIn < 11 { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + if itemModel.SellIn < 6 { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + } + } + } + + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.SellIn = itemModel.SellIn - 1 + } + + if itemModel.SellIn < 0 { + if itemModel.Name != "Aged Brie" { + if itemModel.Name != "Backstage passes to a TAFKAL80ETC concert" { + if itemModel.Quality > 0 { + if itemModel.Name != "Sulfuras, Hand of Ragnaros" { + itemModel.Quality = itemModel.Quality - 1 + } + } + } else { + itemModel.Quality = itemModel.Quality - itemModel.Quality + } + } else { + if itemModel.Quality < 50 { + itemModel.Quality = itemModel.Quality + 1 + } + } + } + + return nil +}