2021-07-21 23:04:00 +00:00
|
|
|
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"
|
2021-07-21 23:04:00 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type memoryTokenRepository struct {
|
2021-09-20 15:45:54 +00:00
|
|
|
mutex *sync.RWMutex
|
|
|
|
tokens []*model.Token
|
2021-07-21 23:04:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewMemoryTokenRepository() token.Repository {
|
|
|
|
return &memoryTokenRepository{
|
2021-09-20 15:45:54 +00:00
|
|
|
mutex: new(sync.RWMutex),
|
|
|
|
tokens: make([]*model.Token, 0),
|
2021-07-21 23:04:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (repo *memoryTokenRepository) Create(ctx context.Context, token *model.Token) error {
|
2021-09-20 15:45:54 +00:00
|
|
|
repo.mutex.Lock()
|
2021-07-21 23:04:00 +00:00
|
|
|
|
2021-09-20 15:45:54 +00:00
|
|
|
repo.tokens = append(repo.tokens, token)
|
2021-07-21 23:04:00 +00:00
|
|
|
|
2021-09-20 15:45:54 +00:00
|
|
|
repo.mutex.Unlock()
|
2021-07-21 23:04:00 +00:00
|
|
|
|
|
|
|
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-07-21 23:04:00 +00:00
|
|
|
}
|
|
|
|
|
2021-09-20 15:45:54 +00:00
|
|
|
repo.mutex.RUnlock()
|
|
|
|
|
|
|
|
return nil
|
2021-07-21 23:04:00 +00:00
|
|
|
}
|