Basic "scotty auth" implementation

This commit is contained in:
Philipp Wolfer 2023-11-19 23:52:13 +01:00
parent 8b227cb514
commit 14d944c7ad
No known key found for this signature in database
GPG key ID: 8FDF744D4919943B
8 changed files with 238 additions and 6 deletions

View file

@ -23,11 +23,15 @@ THE SOFTWARE.
package storage
import (
"encoding/json"
"fmt"
"log"
"os"
"time"
"github.com/glebarez/sqlite"
"golang.org/x/oauth2"
"gorm.io/datatypes"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/logger"
@ -52,7 +56,7 @@ func New(dsn string) (db Database, err error) {
db.db = gornDb
// Migrate the schema
err = gornDb.AutoMigrate(&ImportTimestamp{})
err = gornDb.AutoMigrate(&ImportTimestamp{}, &OAuth2Token{})
return
}
@ -78,3 +82,34 @@ func (db Database) SetImportTimestamp(source string, target string, entity strin
}).Create(&entry).Error
return err
}
func (db Database) GetOAuth2Token(service string) (*oauth2.Token, error) {
result := OAuth2Token{
Service: service,
}
err := db.db.Limit(1).Find(&result).Error
if err != nil {
return nil, err
}
token := oauth2.Token{}
if result.Token != nil {
err = json.Unmarshal(result.Token, &token)
}
fmt.Printf("TOK DEC: %v\n", token)
return &token, err
}
func (db Database) SetOAuth2Token(service string, token oauth2.Token) error {
jsonTok, err := json.Marshal(token)
if err != nil {
return err
}
entry := OAuth2Token{
Service: service,
Token: datatypes.JSON(jsonTok),
}
err = db.db.Clauses(clause.OnConflict{
DoUpdates: clause.AssignmentColumns([]string{"token", "updated_at"}),
}).Create(&entry).Error
return err
}

View file

@ -29,6 +29,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uploadedlobster.com/scotty/storage"
"golang.org/x/oauth2"
)
func TestTimestampUpdate(t *testing.T) {
@ -50,3 +51,23 @@ func TestTimestampUpdate(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, newTimestamp.Unix(), timestamp.Unix())
}
func TestOAuth2TokenUpdate(t *testing.T) {
db, err := storage.New(":memory:")
require.NoError(t, err)
service := "spotify"
token, err := db.GetOAuth2Token(service)
require.NoError(t, err)
assert.Equal(t, "", token.AccessToken)
newToken := oauth2.Token{
AccessToken: "thetoken",
}
err = db.SetOAuth2Token(service, newToken)
require.NoError(t, err)
token, err = db.GetOAuth2Token(service)
require.NoError(t, err)
assert.Equal(t, newToken.AccessToken, token.AccessToken)
}

View file

@ -24,6 +24,8 @@ package storage
import (
"time"
"gorm.io/datatypes"
)
type ImportTimestamp struct {
@ -34,3 +36,14 @@ type ImportTimestamp struct {
UpdatedAt time.Time
Timestamp time.Time `gorm:"default:'1970-01-01T00:00:00'"`
}
type OAuth2Token struct {
Service string `gorm:"primaryKey"`
Token datatypes.JSON `gorm:"type:json"`
CreatedAt time.Time
UpdatedAt time.Time
}
func (OAuth2Token) TableName() string {
return "oauth2_tokens"
}