diff --git a/internal/client/repository.go b/internal/client/repository.go new file mode 100644 index 0000000..c67d0d7 --- /dev/null +++ b/internal/client/repository.go @@ -0,0 +1,11 @@ +package client + +import ( + "context" + + "source.toby3d.me/website/oauth/internal/model" +) + +type Repository interface { + Get(ctx context.Context, id string) (*model.Client, error) +} diff --git a/internal/client/usecase.go b/internal/client/usecase.go new file mode 100644 index 0000000..8d006ba --- /dev/null +++ b/internal/client/usecase.go @@ -0,0 +1,11 @@ +package client + +import ( + "context" + + "source.toby3d.me/website/oauth/internal/model" +) + +type UseCase interface { + Discovery(ctx context.Context, clientID model.URL) (*model.Client, error) +} diff --git a/internal/client/usecase/client_ucase.go b/internal/client/usecase/client_ucase.go new file mode 100644 index 0000000..e9e9705 --- /dev/null +++ b/internal/client/usecase/client_ucase.go @@ -0,0 +1,22 @@ +package usecase + +import ( + "context" + + "source.toby3d.me/website/oauth/internal/client" + "source.toby3d.me/website/oauth/internal/model" +) + +type clientUseCase struct { + clients client.Repository +} + +func NewClientUseCase(clients client.Repository) client.UseCase { + return &clientUseCase{ + clients: clients, + } +} + +func (useCase *clientUseCase) Discovery(ctx context.Context, clientID model.URL) (*model.Client, error) { + return useCase.clients.Get(ctx, string(clientID)) +} diff --git a/internal/client/usecase/client_ucase_test.go b/internal/client/usecase/client_ucase_test.go new file mode 100644 index 0000000..192b15a --- /dev/null +++ b/internal/client/usecase/client_ucase_test.go @@ -0,0 +1,39 @@ +package usecase_test + +import ( + "context" + "sync" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + repository "source.toby3d.me/website/oauth/internal/client/repository/memory" + "source.toby3d.me/website/oauth/internal/client/usecase" + "source.toby3d.me/website/oauth/internal/model" +) + +func TestDiscovery(t *testing.T) { + t.Parallel() + + require := require.New(t) + assert := assert.New(t) + store := new(sync.Map) + client := &model.Client{ + ID: "http://127.0.0.1:2368/", + Name: "Example App", + Logo: "http://127.0.0.1:2368/logo.png", + URL: "http://127.0.0.1:2368/", + RedirectURI: []model.URL{ + "https://app.example.com/redirect", + "http://127.0.0.1:2368/redirect", + }, + } + + store.Store(string(client.ID), client) + + result, err := usecase.NewClientUseCase(repository.NewMemoryClientRepository(store)).Discovery(context.TODO(), + client.ID) + require.NoError(err) + assert.Equal(client, result) +}