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 }