mirror of https://github.com/fmartingr/bazaar.git
55 lines
1.0 KiB
Go
55 lines
1.0 KiB
Go
package manager
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
|
|
"github.com/fmartingr/bazaar/pkg/clients"
|
|
"github.com/fmartingr/bazaar/pkg/models"
|
|
)
|
|
|
|
var ErrShopNotFound = fmt.Errorf("shop not found for domain")
|
|
|
|
type Manager struct {
|
|
domains map[string]models.Shop
|
|
}
|
|
|
|
func (m *Manager) Register(domains []string, shopFactory models.ShopFactory) {
|
|
baseShop := models.NewShopOptions(clients.NewBasicHttpClient())
|
|
shop := shopFactory(baseShop)
|
|
|
|
for _, domain := range domains {
|
|
if _, exists := m.domains[domain]; !exists {
|
|
m.domains[domain] = shop
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *Manager) GetShop(host string) models.Shop {
|
|
shop, exists := m.domains[host]
|
|
if !exists {
|
|
return nil
|
|
}
|
|
return shop
|
|
}
|
|
|
|
func (m *Manager) Retrieve(productURL string) (*models.Product, error) {
|
|
itemUrl, err := url.Parse(productURL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error parsing url: %s", err)
|
|
}
|
|
|
|
shop := m.GetShop(itemUrl.Host)
|
|
if shop == nil {
|
|
return nil, ErrShopNotFound
|
|
}
|
|
|
|
return shop.Get(itemUrl)
|
|
}
|
|
|
|
func NewManager() Manager {
|
|
return Manager{
|
|
domains: make(map[string]models.Shop),
|
|
}
|
|
}
|