🎨 Little format client and token code

This commit is contained in:
Maxim Lebedev 2021-10-05 11:54:36 +05:00
parent a7ba6267aa
commit 83b9f56a4f
Signed by: toby3d
GPG Key ID: 1F14E25B7C119FC5
9 changed files with 39 additions and 28 deletions

View File

@ -39,9 +39,14 @@ func NewHTTPClientRepository(c *http.Client) client.Repository {
} }
func (repo *httpClientRepository) Get(ctx context.Context, id string) (*domain.Client, error) { func (repo *httpClientRepository) Get(ctx context.Context, id string) (*domain.Client, error) {
u, err := url.Parse(id)
if err != nil {
return nil, errors.Wrap(err, "failed to parse id as url")
}
req := http.AcquireRequest() req := http.AcquireRequest()
defer http.ReleaseRequest(req) defer http.ReleaseRequest(req)
req.SetRequestURI(id) req.SetRequestURI(u.String())
req.Header.SetMethod(http.MethodGet) req.Header.SetMethod(http.MethodGet)
resp := http.AcquireResponse() resp := http.AcquireResponse()
@ -62,11 +67,6 @@ func (repo *httpClientRepository) Get(ctx context.Context, id string) (*domain.C
client.RedirectURI = append(client.RedirectURI, l.URL) client.RedirectURI = append(client.RedirectURI, l.URL)
} }
u, err := url.Parse(id)
if err != nil {
return nil, errors.Wrap(err, "failed to parse id as url")
}
data := microformats.Parse(bytes.NewReader(resp.Body()), u) data := microformats.Parse(bytes.NewReader(resp.Body()), u)
for _, item := range data.Items { for _, item := range data.Items {

View File

@ -36,7 +36,7 @@ func TestGet(t *testing.T) {
t.Parallel() t.Parallel()
client, _, cleanup := util.TestServe(t, func(ctx *http.RequestCtx) { client, _, cleanup := util.TestServe(t, func(ctx *http.RequestCtx) {
ctx.Response.Header.Set(http.HeaderLink, `<https://app.example.com/redirect>; rel="redirect_uri">`) ctx.Response.Header.Set(http.HeaderLink, `<https://app.example.net/redirect>; rel="redirect_uri">`)
ctx.SetStatusCode(http.StatusOK) ctx.SetStatusCode(http.StatusOK)
ctx.SetContentType(common.MIMETextHTML) ctx.SetContentType(common.MIMETextHTML)
ctx.SetBodyString(testBody) ctx.SetBodyString(testBody)

View File

@ -2,6 +2,7 @@ package memory
import ( import (
"context" "context"
"path"
"sync" "sync"
"source.toby3d.me/website/oauth/internal/client" "source.toby3d.me/website/oauth/internal/client"
@ -12,6 +13,8 @@ type memoryClientRepository struct {
clients *sync.Map clients *sync.Map
} }
const Key string = "clients"
func NewMemoryClientRepository(clients *sync.Map) client.Repository { func NewMemoryClientRepository(clients *sync.Map) client.Repository {
return &memoryClientRepository{ return &memoryClientRepository{
clients: clients, clients: clients,
@ -19,7 +22,7 @@ func NewMemoryClientRepository(clients *sync.Map) client.Repository {
} }
func (repo *memoryClientRepository) Get(ctx context.Context, id string) (*domain.Client, error) { func (repo *memoryClientRepository) Get(ctx context.Context, id string) (*domain.Client, error) {
src, ok := repo.clients.Load(id) src, ok := repo.clients.Load(path.Join(Key, id))
if !ok { if !ok {
return nil, nil return nil, nil
} }

View File

@ -2,13 +2,14 @@ package memory_test
import ( import (
"context" "context"
"path"
"sync" "sync"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"source.toby3d.me/website/oauth/internal/client/repository/memory" repository "source.toby3d.me/website/oauth/internal/client/repository/memory"
"source.toby3d.me/website/oauth/internal/domain" "source.toby3d.me/website/oauth/internal/domain"
) )
@ -18,9 +19,9 @@ func TestGet(t *testing.T) {
store := new(sync.Map) store := new(sync.Map)
client := domain.TestClient(t) client := domain.TestClient(t)
store.Store(client.ID, client) store.Store(path.Join(repository.Key, client.ID), client)
result, err := memory.NewMemoryClientRepository(store).Get(context.TODO(), client.ID) result, err := repository.NewMemoryClientRepository(store).Get(context.TODO(), client.ID)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, client, result) assert.Equal(t, client, result)
} }

View File

@ -2,6 +2,7 @@ package usecase_test
import ( import (
"context" "context"
"path"
"sync" "sync"
"testing" "testing"
@ -19,7 +20,7 @@ func TestDiscovery(t *testing.T) {
store := new(sync.Map) store := new(sync.Map)
client := domain.TestClient(t) client := domain.TestClient(t)
store.Store(client.ID, client) store.Store(path.Join(repository.Key, client.ID), client)
result, err := usecase.NewClientUseCase(repository.NewMemoryClientRepository(store)).Discovery(context.TODO(), result, err := usecase.NewClientUseCase(repository.NewMemoryClientRepository(store)).Discovery(context.TODO(),
client.ID) client.ID)

View File

@ -3,10 +3,10 @@ package domain
import "testing" import "testing"
type Client struct { type Client struct {
RedirectURI []string
ID string ID string
Logo string Logo string
Name string Name string
RedirectURI []string
URL string URL string
} }
@ -26,7 +26,7 @@ func TestClient(tb testing.TB) *Client {
Logo: "https://app.example.com/logo.png", Logo: "https://app.example.com/logo.png",
URL: "https://app.example.com/", URL: "https://app.example.com/",
RedirectURI: []string{ RedirectURI: []string{
"https://app.example.com/redirect", "https://app.example.net/redirect",
"https://app.example.com/redirect", "https://app.example.com/redirect",
}, },
} }

View File

@ -10,6 +10,7 @@ type Token struct {
AccessToken string AccessToken string
ClientID string ClientID string
Me string Me string
Profile *Profile
Scopes []string Scopes []string
Type string Type string
} }
@ -29,6 +30,7 @@ func TestToken(tb testing.TB) *Token {
AccessToken: random.New().String(32), AccessToken: random.New().String(32),
ClientID: "https://app.example.com/", ClientID: "https://app.example.com/",
Me: "https://user.example.net/", Me: "https://user.example.net/",
Profile: TestProfile(tb),
Scopes: []string{"create", "update", "delete"}, Scopes: []string{"create", "update", "delete"},
Type: "Bearer", Type: "Bearer",
} }

View File

@ -2,6 +2,7 @@ package memory
import ( import (
"context" "context"
"path"
"sync" "sync"
"source.toby3d.me/website/oauth/internal/domain" "source.toby3d.me/website/oauth/internal/domain"
@ -12,6 +13,8 @@ type memoryTokenRepository struct {
tokens *sync.Map tokens *sync.Map
} }
const Key string = "tokens"
func NewMemoryTokenRepository(tokens *sync.Map) token.Repository { func NewMemoryTokenRepository(tokens *sync.Map) token.Repository {
return &memoryTokenRepository{ return &memoryTokenRepository{
tokens: tokens, tokens: tokens,
@ -19,7 +22,7 @@ func NewMemoryTokenRepository(tokens *sync.Map) token.Repository {
} }
func (repo *memoryTokenRepository) Get(ctx context.Context, accessToken string) (*domain.Token, error) { func (repo *memoryTokenRepository) Get(ctx context.Context, accessToken string) (*domain.Token, error) {
src, ok := repo.tokens.Load(accessToken) src, ok := repo.tokens.Load(path.Join(Key, accessToken))
if !ok { if !ok {
return nil, nil return nil, nil
} }
@ -46,13 +49,13 @@ func (repo *memoryTokenRepository) Create(ctx context.Context, accessToken *doma
} }
func (repo *memoryTokenRepository) Update(ctx context.Context, accessToken *domain.Token) error { func (repo *memoryTokenRepository) Update(ctx context.Context, accessToken *domain.Token) error {
repo.tokens.Store(accessToken.AccessToken, accessToken) repo.tokens.Store(path.Join(Key, accessToken.AccessToken), accessToken)
return nil return nil
} }
func (repo *memoryTokenRepository) Remove(ctx context.Context, accessToken string) error { func (repo *memoryTokenRepository) Remove(ctx context.Context, accessToken string) error {
repo.tokens.Delete(accessToken) repo.tokens.Delete(path.Join(Key, accessToken))
return nil return nil
} }

View File

@ -2,6 +2,7 @@ package memory_test
import ( import (
"context" "context"
"path"
"sync" "sync"
"testing" "testing"
@ -10,7 +11,7 @@ import (
"source.toby3d.me/website/oauth/internal/domain" "source.toby3d.me/website/oauth/internal/domain"
"source.toby3d.me/website/oauth/internal/token" "source.toby3d.me/website/oauth/internal/token"
"source.toby3d.me/website/oauth/internal/token/repository/memory" repository "source.toby3d.me/website/oauth/internal/token/repository/memory"
) )
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
@ -19,9 +20,9 @@ func TestGet(t *testing.T) {
store := new(sync.Map) store := new(sync.Map)
accessToken := domain.TestToken(t) accessToken := domain.TestToken(t)
store.Store(accessToken.AccessToken, accessToken) store.Store(path.Join(repository.Key, accessToken.AccessToken), accessToken)
result, err := memory.NewMemoryTokenRepository(store).Get(context.TODO(), accessToken.AccessToken) result, err := repository.NewMemoryTokenRepository(store).Get(context.TODO(), accessToken.AccessToken)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, accessToken, result) assert.Equal(t, accessToken, result)
} }
@ -32,10 +33,10 @@ func TestCreate(t *testing.T) {
store := new(sync.Map) store := new(sync.Map)
accessToken := domain.TestToken(t) accessToken := domain.TestToken(t)
repo := memory.NewMemoryTokenRepository(store) repo := repository.NewMemoryTokenRepository(store)
require.NoError(t, repo.Create(context.TODO(), accessToken)) require.NoError(t, repo.Create(context.TODO(), accessToken))
result, ok := store.Load(accessToken.AccessToken) result, ok := store.Load(path.Join(repository.Key, accessToken.AccessToken))
assert.True(t, ok) assert.True(t, ok)
assert.Equal(t, accessToken, result) assert.Equal(t, accessToken, result)
@ -48,15 +49,15 @@ func TestUpdate(t *testing.T) {
store := new(sync.Map) store := new(sync.Map)
accessToken := domain.TestToken(t) accessToken := domain.TestToken(t)
store.Store(accessToken.AccessToken, accessToken) store.Store(path.Join(repository.Key, accessToken.AccessToken), accessToken)
tokenCopy := *accessToken tokenCopy := *accessToken
tokenCopy.ClientID = "https://client.example.com/" tokenCopy.ClientID = "https://client.example.com/"
tokenCopy.Me = "https://toby3d.ru/" tokenCopy.Me = "https://toby3d.ru/"
require.NoError(t, memory.NewMemoryTokenRepository(store).Update(context.TODO(), &tokenCopy)) require.NoError(t, repository.NewMemoryTokenRepository(store).Update(context.TODO(), &tokenCopy))
result, ok := store.Load(accessToken.AccessToken) result, ok := store.Load(path.Join(repository.Key, accessToken.AccessToken))
assert.True(t, ok) assert.True(t, ok)
assert.NotEqual(t, accessToken, result) assert.NotEqual(t, accessToken, result)
assert.Equal(t, &tokenCopy, result) assert.Equal(t, &tokenCopy, result)
@ -68,11 +69,11 @@ func TestDelete(t *testing.T) {
store := new(sync.Map) store := new(sync.Map)
accessToken := domain.TestToken(t) accessToken := domain.TestToken(t)
store.Store(accessToken.AccessToken, accessToken) store.Store(path.Join(repository.Key, accessToken.AccessToken), accessToken)
require.NoError(t, memory.NewMemoryTokenRepository(store).Remove(context.TODO(), accessToken.AccessToken)) require.NoError(t, repository.NewMemoryTokenRepository(store).Remove(context.TODO(), accessToken.AccessToken))
result, ok := store.Load(accessToken.AccessToken) result, ok := store.Load(path.Join(repository.Key, accessToken.AccessToken))
assert.False(t, ok) assert.False(t, ok)
assert.Nil(t, result) assert.Nil(t, result)
} }