package db import ( "crypto/rand" "encoding/base64" "farga/db/types" "farga/lib" "time" "github.com/google/uuid" "golang.org/x/oauth2" ) // gets an oauth state from the token func (db *DB) OAuthState(token string) (types.OAuthState, error) { var state types.OAuthState err := db.First(&state, "state = ?", token).Error return state, err } // creates an OAuth state. func (db *DB) CreateOAuthState(id uuid.UUID) (*types.OAuthState, error) { b := make([]byte, 32) if _, err := rand.Read(b); err != nil { return nil, err } state := base64.RawURLEncoding.EncodeToString(b) verifier := oauth2.GenerateVerifier() oauthState := &types.OAuthState{ State: state, Verifier: verifier, ExpiresAt: time.Now().Add(lib.OAuthStateDurationMins * time.Minute), UserID: id, } if err := db.Create(oauthState).Error; err != nil { return nil, err } return oauthState, nil } // checks states' expiresAt and if they expired, it Deletes them func (db *DB) DeleteExpiredOAuthStates() { db.Where("expires_at < ?", time.Now()).Delete(&types.OAuthState{}) } // Deletes a given oauth state from the database func (db *DB) DeleteOAuthState(id uuid.UUID) error { var state = types.OAuthState{ UUID_ID: types.UUID_ID{ID: id}, } result := db.Delete(&state) return result.Error }