github.com/jxgolibs/go-oauth2-server@v1.0.1/oauth/access_token.go (about)

     1  package oauth
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/RichardKnop/go-oauth2-server/models"
     7  )
     8  
     9  // GrantAccessToken deletes old tokens and grants a new access token
    10  func (s *Service) GrantAccessToken(client *models.OauthClient, user *models.OauthUser, expiresIn int, scope string) (*models.OauthAccessToken, error) {
    11  	// Begin a transaction
    12  	tx := s.db.Begin()
    13  
    14  	// Delete expired access tokens
    15  	query := tx.Unscoped().Where("client_id = ?", client.ID)
    16  	if user != nil && len([]rune(user.ID)) > 0 {
    17  		query = query.Where("user_id = ?", user.ID)
    18  	} else {
    19  		query = query.Where("user_id IS NULL")
    20  	}
    21  	if err := query.Where("expires_at <= ?", time.Now()).Delete(new(models.OauthAccessToken)).Error; err != nil {
    22  		tx.Rollback() // rollback the transaction
    23  		return nil, err
    24  	}
    25  
    26  	// Create a new access token
    27  	accessToken := models.NewOauthAccessToken(client, user, expiresIn, scope)
    28  	if err := tx.Create(accessToken).Error; err != nil {
    29  		tx.Rollback() // rollback the transaction
    30  		return nil, err
    31  	}
    32  	accessToken.Client = client
    33  	accessToken.User = user
    34  
    35  	// Commit the transaction
    36  	if err := tx.Commit().Error; err != nil {
    37  		tx.Rollback() // rollback the transaction
    38  		return nil, err
    39  	}
    40  
    41  	return accessToken, nil
    42  }