github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/access_token_factory.go (about)

     1  package db
     2  
     3  import (
     4  	"database/sql"
     5  	"time"
     6  
     7  	sq "github.com/Masterminds/squirrel"
     8  )
     9  
    10  //go:generate counterfeiter . AccessTokenFactory
    11  
    12  type AccessTokenFactory interface {
    13  	CreateAccessToken(token string, claims Claims) error
    14  	GetAccessToken(token string) (AccessToken, bool, error)
    15  }
    16  
    17  func NewAccessTokenFactory(conn Conn) AccessTokenFactory {
    18  	return &accessTokenFactory{conn}
    19  }
    20  
    21  type accessTokenFactory struct {
    22  	conn Conn
    23  }
    24  
    25  func (a *accessTokenFactory) CreateAccessToken(token string, claims Claims) error {
    26  	var expiry int64
    27  	if claims.Expiry != nil {
    28  		expiry = int64(*claims.Expiry)
    29  	}
    30  	_, err := psql.Insert("access_tokens").
    31  		Columns("token", "sub", "expires_at", "claims").
    32  		Values(token, claims.Subject, time.Unix(expiry, 0), claims).
    33  		RunWith(a.conn).
    34  		Exec()
    35  	if err != nil {
    36  		return err
    37  	}
    38  	return nil
    39  }
    40  
    41  func (a *accessTokenFactory) GetAccessToken(token string) (AccessToken, bool, error) {
    42  	row := psql.Select("token", "claims").
    43  		From("access_tokens").
    44  		Where(sq.Eq{"token": token}).
    45  		RunWith(a.conn).
    46  		QueryRow()
    47  
    48  	var accessToken AccessToken
    49  	err := scanAccessToken(&accessToken, row)
    50  	if err != nil {
    51  		if err == sql.ErrNoRows {
    52  			return AccessToken{}, false, nil
    53  		}
    54  		return AccessToken{}, false, err
    55  	}
    56  	return accessToken, true, nil
    57  }