Updated services, split into strategy pattern for each kind of update

This commit is contained in:
Daniel F 2023-07-11 20:51:34 +01:00
parent 79f0e0d3d6
commit 1000c5e1e5
7 changed files with 243 additions and 10 deletions

View File

@ -3,7 +3,6 @@ package controllers
import ( import (
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
//"strings"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"

View File

@ -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
}

View File

@ -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
}

View File

@ -8,20 +8,38 @@ import (
type ItemUpdateServiceProvider struct { type ItemUpdateServiceProvider struct {
logger lib.Logger logger lib.Logger
itemUpdateService ItemUpdateService normalItemUpdateService NormalItemUpdateService
agedBrieItemUpdateService AgedBrieItemUpdateService
backstagePassItemUpdateService BackstagePassItemUpdateService
sulfurasItemUpdateService SulfurasItemUpdateService
} }
func NewItemUpdateServiceProvider( func NewItemUpdateServiceProvider(
logger lib.Logger, logger lib.Logger,
itemUpdateService ItemUpdateService, normalItemUpdateService NormalItemUpdateService,
agedBrieItemUpdateService AgedBrieItemUpdateService,
backstagePassItemUpdateService BackstagePassItemUpdateService,
sulfurasItemUpdateService SulfurasItemUpdateService,
) domains.ItemUpdateServiceProvider { ) domains.ItemUpdateServiceProvider {
return ItemUpdateServiceProvider{ return ItemUpdateServiceProvider{
logger: logger, logger: logger,
itemUpdateService: itemUpdateService, normalItemUpdateService: normalItemUpdateService,
agedBrieItemUpdateService: agedBrieItemUpdateService,
backstagePassItemUpdateService: backstagePassItemUpdateService,
sulfurasItemUpdateService: sulfurasItemUpdateService,
} }
} }
func (this ItemUpdateServiceProvider) GetUpdateService(item *models.Item) domains.ItemUpdateService { 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
}
} }

View File

@ -5,17 +5,17 @@ import (
"github.com/emilybache/gildedrose-refactoring-kata/models" "github.com/emilybache/gildedrose-refactoring-kata/models"
) )
type ItemUpdateService struct { type NormalItemUpdateService struct {
logger lib.Logger logger lib.Logger
} }
func NewItemUpdateService(logger lib.Logger) ItemUpdateService { func NewNormalItemUpdateService(logger lib.Logger) NormalItemUpdateService {
return ItemUpdateService{ return NormalItemUpdateService{
logger: logger, logger: logger,
} }
} }
func (this ItemUpdateService) UpdateQuality(item *models.Item) error { func (this NormalItemUpdateService) UpdateQuality(item *models.Item) error {
item.Mutex.Lock() item.Mutex.Lock()
defer item.Mutex.Unlock() defer item.Mutex.Unlock()

View File

@ -3,6 +3,9 @@ package services
import "go.uber.org/fx" import "go.uber.org/fx"
var Module = fx.Options( var Module = fx.Options(
fx.Provide(NewItemUpdateService), fx.Provide(NewNormalItemUpdateService),
fx.Provide(NewAgedBrieItemUpdateService),
fx.Provide(NewBackstagePassItemUpdateService),
fx.Provide(NewSulfurasItemUpdateService),
fx.Provide(NewItemUpdateServiceProvider), fx.Provide(NewItemUpdateServiceProvider),
) )

View File

@ -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
}