From 9f209c8931d386a00382eb5f4965cdee9e08ab40 Mon Sep 17 00:00:00 2001 From: Vassiliy Yegorov Date: Fri, 3 Jul 2026 12:36:18 +0700 Subject: [PATCH] =?UTF-8?q?feat(provider):=20=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D1=84=D0=B5=D0=B9=D1=81=20Provider,=20Credentials,=20Zon?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/provider/provider.go | 28 +++++++++++++++++++++++++++ internal/provider/provider_test.go | 31 ++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 internal/provider/provider.go create mode 100644 internal/provider/provider_test.go diff --git a/internal/provider/provider.go b/internal/provider/provider.go new file mode 100644 index 0000000..f2a8f23 --- /dev/null +++ b/internal/provider/provider.go @@ -0,0 +1,28 @@ +package provider + +import ( + "context" + + "github.com/vasyakrg/dns-autoresolver/internal/diff" + "github.com/vasyakrg/dns-autoresolver/internal/model" +) + +// Credentials holds the secret used to authenticate against a provider. +// For Selectel this is the project-scoped token sent as X-Auth-Token. +type Credentials struct { + Secret string +} + +// Zone is a provider-neutral DNS zone reference. +type Zone struct { + ID string + Name string +} + +// Provider is implemented per DNS provider (Selectel first). +type Provider interface { + Name() string + ListZones(ctx context.Context, creds Credentials) ([]Zone, error) + GetRecords(ctx context.Context, creds Credentials, zoneID string) ([]model.Record, error) + ApplyChanges(ctx context.Context, creds Credentials, zoneID string, cs diff.Changeset) error +} diff --git a/internal/provider/provider_test.go b/internal/provider/provider_test.go new file mode 100644 index 0000000..800aad0 --- /dev/null +++ b/internal/provider/provider_test.go @@ -0,0 +1,31 @@ +package provider + +import ( + "context" + "testing" + + "github.com/vasyakrg/dns-autoresolver/internal/diff" + "github.com/vasyakrg/dns-autoresolver/internal/model" +) + +// stubProvider проверяет, что интерфейс реализуем. +type stubProvider struct{} + +func (stubProvider) Name() string { return "stub" } +func (stubProvider) ListZones(context.Context, Credentials) ([]Zone, error) { + return []Zone{{ID: "1", Name: "example.com."}}, nil +} +func (stubProvider) GetRecords(context.Context, Credentials, string) ([]model.Record, error) { + return nil, nil +} +func (stubProvider) ApplyChanges(context.Context, Credentials, string, diff.Changeset) error { + return nil +} + +func TestProviderInterfaceSatisfied(t *testing.T) { + var p Provider = stubProvider{} + zs, err := p.ListZones(context.Background(), Credentials{Secret: "x"}) + if err != nil || len(zs) != 1 || zs[0].Name != "example.com." { + t.Fatalf("unexpected: %v %v", zs, err) + } +}