Files
2023-08-15 14:45:40 -05:00

95 lines
2.5 KiB
Go

package itemapi
import (
"context"
item "crossnokaye-interview-assignment/services/item/gen/item"
"fmt"
"log"
)
// item service example implementation.
// The example methods log the requests and return zero values.
type itemsrvc struct {
logger *log.Logger
items *map[string]*item.Item
}
// NewItem returns the item service implementation.
func NewItem(logger *log.Logger) item.Service {
itemsMap := make(map[string]*item.Item)
return &itemsrvc{logger, &itemsMap}
}
// GetItem implements getItem.
func (s *itemsrvc) GetItem(ctx context.Context, p *item.GetItemPayload) (res *item.Item, err error) {
s.logger.Print("itemToGet.getItem")
itemToGet := (*s.items)[*p.Name]
if itemToGet == nil {
s.logger.Printf("item with name '%s' not found", *p.Name)
return nil, item.MakeNotFound(fmt.Errorf("item with name '%s' not found", *p.Name))
}
res = (*s.items)[*p.Name]
return
}
func (s *itemsrvc) ListItems(ctx context.Context, payload *item.ListItemsPayload) (res []*item.Item, err error) {
if payload.NameFilter != nil {
for _, value := range payload.NameFilter {
res = append(res, (*s.items)[value])
}
} else {
for _, value := range *s.items {
res = append(res, value)
}
}
return
}
// CreateItem implements createItem.
func (s *itemsrvc) CreateItem(ctx context.Context, p *item.Item) (res *item.Item, err error) {
s.logger.Print("item.createItem")
name := p.Name
existingItem := (*s.items)[name]
if existingItem != nil {
s.logger.Printf("item with name '%s' already exists", p.Name)
return nil, item.MakeAlreadyExists(fmt.Errorf("item with name '%s' already exists", p.Name))
}
(*s.items)[name] = p
res = (*s.items)[name]
return
}
// UpdateItem implements updateItem.
func (s *itemsrvc) UpdateItem(ctx context.Context, p *item.Item) (res *item.Item, err error) {
s.logger.Print("itemToGet.updateItem")
itemToUpdate := (*s.items)[p.Name]
if itemToUpdate == nil {
s.logger.Printf("item with name '%s' not found", p.Name)
return nil, item.MakeNotFound(fmt.Errorf("item with name '%s' not found", p.Name))
}
(*s.items)[p.Name] = p
res = (*s.items)[p.Name]
return
}
// DeleteItem implements deleteItem.
func (s *itemsrvc) DeleteItem(ctx context.Context, p *item.DeleteItemPayload) (err error) {
s.logger.Print("item.deleteItem")
itemToDelete := (*s.items)[*p.Name]
if itemToDelete == nil {
s.logger.Printf("item with name '%s' not found", *p.Name)
return item.MakeNotFound(fmt.Errorf("item with name '%s' not found", *p.Name))
}
delete(*s.items, *p.Name)
return
}