auth/internal/token/repository/memory/memory_token.go

76 lines
1.3 KiB
Go
Raw Normal View History

package memory
import (
"context"
"sync"
2021-09-20 15:45:54 +00:00
"source.toby3d.me/website/oauth/internal/model"
"source.toby3d.me/website/oauth/internal/token"
)
type memoryTokenRepository struct {
2021-09-20 15:45:54 +00:00
mutex *sync.RWMutex
tokens []*model.Token
}
func NewMemoryTokenRepository() token.Repository {
return &memoryTokenRepository{
2021-09-20 15:45:54 +00:00
mutex: new(sync.RWMutex),
tokens: make([]*model.Token, 0),
}
}
func (repo *memoryTokenRepository) Create(ctx context.Context, token *model.Token) error {
2021-09-20 15:45:54 +00:00
repo.mutex.Lock()
2021-09-20 15:45:54 +00:00
repo.tokens = append(repo.tokens, token)
2021-09-20 15:45:54 +00:00
repo.mutex.Unlock()
return nil
}
func (repo *memoryTokenRepository) Get(ctx context.Context, token string) (*model.Token, error) {
2021-09-20 15:45:54 +00:00
repo.mutex.RLock()
defer repo.mutex.RUnlock()
for i := range repo.tokens {
if repo.tokens[i].AccessToken != token {
continue
}
return repo.tokens[i], nil
}
return nil, nil
}
func (repo *memoryTokenRepository) Delete(ctx context.Context, token string) error {
repo.mutex.RLock()
for i := range repo.tokens {
if repo.tokens[i].AccessToken != token {
continue
}
repo.mutex.RUnlock()
repo.mutex.Lock()
if i < len(repo.tokens)-1 {
copy(repo.tokens[i:], repo.tokens[i+1:])
}
repo.tokens[len(repo.tokens)-1] = nil
repo.tokens = repo.tokens[:len(repo.tokens)-1]
repo.mutex.Unlock()
repo.mutex.RLock()
break
}
2021-09-20 15:45:54 +00:00
repo.mutex.RUnlock()
return nil
}