Skip to content

Commit 21ad5d5

Browse files
committed
refactor: move service factory
1 parent 595e89d commit 21ad5d5

File tree

7 files changed

+126
-98
lines changed

7 files changed

+126
-98
lines changed

.mockery.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
with-expecter: True
2+
outpkg: "mock_{{.PackageName}}"
23
packages:
34
github.com/davidramiro/frigabun/services:
5+
interfaces:
6+
DnsUpdateService:
7+
HTTPClient:
8+
github.com/davidramiro/frigabun/services/factory:
49
interfaces:
510
ServiceFactory:
6-
DnsUpdateService:
11+
config:
12+
all: True

.testcoverage.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ profile: cover.out
33
threshold:
44
file: 70
55
package: 80
6-
total: 95
6+
total: 90
77

88
exclude:
99
paths:
10+
- main.go
1011
- mocks

internal/api/api.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package api
33
import (
44
"fmt"
55
"github.com/davidramiro/frigabun/services"
6+
"github.com/davidramiro/frigabun/services/factory"
67
"github.com/rs/zerolog/log"
78
"net/http"
89
"strings"
@@ -12,7 +13,7 @@ import (
1213
)
1314

1415
type UpdateApi struct {
15-
dnsServiceFactory services.ServiceFactory
16+
dnsServiceFactory factory.ServiceFactory
1617
}
1718

1819
type StatusResponse struct {
@@ -27,7 +28,7 @@ type UpdateRequest struct {
2728
Registrar string `query:"registrar"`
2829
}
2930

30-
func NewUpdateApi(dnsServiceFactory services.ServiceFactory) *UpdateApi {
31+
func NewUpdateApi(dnsServiceFactory factory.ServiceFactory) *UpdateApi {
3132
return &UpdateApi{dnsServiceFactory: dnsServiceFactory}
3233
}
3334

main.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package main
33
import (
44
"fmt"
55
"github.com/davidramiro/frigabun/internal/api"
6-
"github.com/davidramiro/frigabun/services"
6+
"github.com/davidramiro/frigabun/services/factory"
77
"github.com/labstack/echo/v4"
88
"github.com/labstack/echo/v4/middleware"
99
"github.com/rs/zerolog/log"
@@ -15,6 +15,7 @@ func main() {
1515

1616
log.Info().Msg("starting frigabun")
1717
log.Info().Msg("reading config")
18+
1819
viper.SetConfigName("config")
1920
viper.SetConfigType("toml")
2021
viper.AddConfigPath(".")
@@ -48,7 +49,7 @@ func main() {
4849
}))
4950
e.Use(middleware.Recover())
5051

51-
factory, err := services.NewDnsUpdateServiceFactory()
52+
factory, err := factory.NewDnsUpdateServiceFactory()
5253
if err != nil {
5354
log.Fatal().Err(err).Msg("cannot init service factory")
5455
}

services/dns_update_service_factory.go

Lines changed: 0 additions & 84 deletions
This file was deleted.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package factory
2+
3+
import (
4+
"github.com/davidramiro/frigabun/services"
5+
"github.com/spf13/viper"
6+
)
7+
8+
type ServiceFactory interface {
9+
Register(services.DnsUpdateService)
10+
Find(services.Registrar) (services.DnsUpdateService, error)
11+
ListServices() []services.Registrar
12+
}
13+
14+
type DnsUpdateServiceFactory struct {
15+
services map[services.Registrar]services.DnsUpdateService
16+
}
17+
18+
func NewDnsUpdateServiceFactory() (*DnsUpdateServiceFactory, error) {
19+
factory := &DnsUpdateServiceFactory{
20+
services: make(map[services.Registrar]services.DnsUpdateService),
21+
}
22+
23+
if viper.GetBool("cloudflare.enabled") {
24+
cloudflareService, err := services.NewCloudflareDnsUpdateService(nil)
25+
if err != nil {
26+
return nil, err
27+
}
28+
29+
factory.Register(cloudflareService)
30+
}
31+
32+
if viper.GetBool("gandi.enabled") {
33+
gandiService, err := services.NewGandiDnsUpdateService(nil)
34+
if err != nil {
35+
return nil, err
36+
}
37+
38+
factory.Register(gandiService)
39+
}
40+
41+
if viper.GetBool("porkbun.enabled") {
42+
porkbunService, err := services.NewPorkbunDnsUpdateService(nil)
43+
if err != nil {
44+
return nil, err
45+
}
46+
47+
factory.Register(porkbunService)
48+
}
49+
50+
return factory, nil
51+
}
52+
53+
func (df *DnsUpdateServiceFactory) Register(service services.DnsUpdateService) {
54+
if service == nil {
55+
return
56+
}
57+
58+
key := service.Registrar()
59+
60+
df.services[key] = service
61+
}
62+
63+
func (df *DnsUpdateServiceFactory) Find(registrar services.Registrar) (service services.DnsUpdateService, err error) {
64+
65+
service, ok := df.services[registrar]
66+
if !ok {
67+
return nil, services.ErrRegistrarNotFound
68+
}
69+
70+
return service, nil
71+
}
72+
73+
func (df *DnsUpdateServiceFactory) ListServices() []services.Registrar {
74+
keys := make([]services.Registrar, len(df.services))
75+
76+
i := 0
77+
for k := range df.services {
78+
keys[i] = k
79+
i++
80+
}
81+
82+
return keys
83+
}

services/dns_update_service_factory_test.go renamed to services/factory/dns_update_service_factory_test.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
package services
1+
package factory
22

33
import (
4+
"github.com/davidramiro/frigabun/services"
45
"github.com/spf13/viper"
56
"github.com/stretchr/testify/assert"
67
"testing"
78
)
89

10+
var factory *DnsUpdateServiceFactory
11+
912
func init() {
1013
viper.Set("cloudflare.enabled", true)
1114
viper.Set("cloudflare.baseurl", "https://api.foo.com/client/v4")
@@ -21,11 +24,12 @@ func init() {
2124
viper.Set("porkbun.apiKey", "foo")
2225
viper.Set("porkbun.apiSecretKey", "bar")
2326
viper.Set("porkbun.ttl", 42)
27+
28+
factory, _ = NewDnsUpdateServiceFactory()
2429
}
2530

2631
func TestNewDnsUpdateServiceFactory(t *testing.T) {
27-
factory, err := NewDnsUpdateServiceFactory()
28-
assert.Nil(t, err, "no error on creating factory")
32+
2933
assert.Equal(t, 3, len(factory.ListServices()), "factory should contain 3 services")
3034

3135
service, err := factory.Find("cloudflare")
@@ -36,13 +40,10 @@ func TestNewDnsUpdateServiceFactory(t *testing.T) {
3640
}
3741

3842
func TestDnsUpdateServiceFactory_ListServices(t *testing.T) {
39-
factory, err := NewDnsUpdateServiceFactory()
40-
assert.Nil(t, err, "no error on creating factory")
4143
assert.Equal(t, 3, len(factory.ListServices()), "factory should contain 3 services")
4244
}
4345

4446
func TestDnsUpdateServiceFactory_FindSuccess(t *testing.T) {
45-
factory, _ := NewDnsUpdateServiceFactory()
4647
service, err := factory.Find("cloudflare")
4748

4849
assert.Nil(t, err)
@@ -52,8 +53,27 @@ func TestDnsUpdateServiceFactory_FindSuccess(t *testing.T) {
5253
}
5354

5455
func TestDnsUpdateServiceFactory_FindInvalidName(t *testing.T) {
55-
factory, _ := NewDnsUpdateServiceFactory()
5656
_, err := factory.Find("cloudbun")
57+
assert.ErrorIs(t, err, services.ErrRegistrarNotFound)
58+
}
59+
60+
func TestNewDnsUpdateServiceFactory_MissingParamForPorkbun(t *testing.T) {
61+
viper.Set("porkbun.baseUrl", "")
62+
f, err := NewDnsUpdateServiceFactory()
63+
assert.ErrorIs(t, err, services.ErrMissingInfoForServiceInit)
64+
assert.Nil(t, f)
65+
}
66+
67+
func TestNewDnsUpdateServiceFactory_MissingParamForCloudflare(t *testing.T) {
68+
viper.Set("cloudflare.apiKey", "")
69+
f, err := NewDnsUpdateServiceFactory()
70+
assert.ErrorIs(t, err, services.ErrMissingInfoForServiceInit)
71+
assert.Nil(t, f)
72+
}
5773

58-
assert.Error(t, err)
74+
func TestNewDnsUpdateServiceFactory_MissingParamForGandi(t *testing.T) {
75+
viper.Set("gandi.ttl", 0)
76+
f, err := NewDnsUpdateServiceFactory()
77+
assert.ErrorIs(t, err, services.ErrMissingInfoForServiceInit)
78+
assert.Nil(t, f)
5979
}

0 commit comments

Comments
 (0)