github.com/dhax/go-base@v0.0.0-20231004214136-8be7e5c1972b/database/authStore.go (about)

     1  package database
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/dhax/go-base/auth/jwt"
     7  	"github.com/dhax/go-base/auth/pwdless"
     8  	"github.com/go-pg/pg"
     9  )
    10  
    11  // AuthStore implements database operations for account pwdlessentication.
    12  type AuthStore struct {
    13  	db *pg.DB
    14  }
    15  
    16  // NewAuthStore return an AuthStore.
    17  func NewAuthStore(db *pg.DB) *AuthStore {
    18  	return &AuthStore{
    19  		db: db,
    20  	}
    21  }
    22  
    23  // GetAccount returns an account by ID.
    24  func (s *AuthStore) GetAccount(id int) (*pwdless.Account, error) {
    25  	a := pwdless.Account{ID: id}
    26  	err := s.db.Model(&a).
    27  		Column("account.*").
    28  		Where("id = ?id").
    29  		First()
    30  	return &a, err
    31  }
    32  
    33  // GetAccountByEmail returns an account by email.
    34  func (s *AuthStore) GetAccountByEmail(e string) (*pwdless.Account, error) {
    35  	a := pwdless.Account{Email: e}
    36  	err := s.db.Model(&a).
    37  		Column("id", "active", "email", "name").
    38  		Where("email = ?email").
    39  		First()
    40  	return &a, err
    41  }
    42  
    43  // UpdateAccount upates account data related to pwdlessentication.
    44  func (s *AuthStore) UpdateAccount(a *pwdless.Account) error {
    45  	_, err := s.db.Model(a).
    46  		Column("last_login").
    47  		WherePK().
    48  		Update()
    49  	return err
    50  }
    51  
    52  // GetToken returns refresh token by token identifier.
    53  func (s *AuthStore) GetToken(t string) (*jwt.Token, error) {
    54  	token := jwt.Token{Token: t}
    55  	err := s.db.Model(&token).
    56  		Where("token = ?token").
    57  		First()
    58  
    59  	return &token, err
    60  }
    61  
    62  // CreateOrUpdateToken creates or updates an existing refresh token.
    63  func (s *AuthStore) CreateOrUpdateToken(t *jwt.Token) error {
    64  	var err error
    65  	if t.ID == 0 {
    66  		err = s.db.Insert(t)
    67  	} else {
    68  		err = s.db.Update(t)
    69  	}
    70  	return err
    71  }
    72  
    73  // DeleteToken deletes a refresh token.
    74  func (s *AuthStore) DeleteToken(t *jwt.Token) error {
    75  	err := s.db.Delete(t)
    76  	return err
    77  }
    78  
    79  // PurgeExpiredToken deletes expired refresh token.
    80  func (s *AuthStore) PurgeExpiredToken() error {
    81  	_, err := s.db.Model(&jwt.Token{}).
    82  		Where("expiry < ?", time.Now()).
    83  		Delete()
    84  
    85  	return err
    86  }