github.com/resonatecoop/id@v1.1.0-43/oauth/access_token.go (about)

     1  package oauth
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/google/uuid"
     8  	"github.com/resonatecoop/user-api/model"
     9  )
    10  
    11  // GrantAccessToken deletes old tokens and grants a new access token
    12  func (s *Service) GrantAccessToken(client *model.Client, user *model.User, expiresIn int, scope string) (*model.AccessToken, error) {
    13  	// Begin a transaction
    14  	tx, err := s.db.Begin()
    15  	ctx := context.Background()
    16  
    17  	//var result Sql.result
    18  
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	accessToken := new(model.AccessToken)
    24  
    25  	// Delete expired access tokens
    26  	if user != nil && user.ID != uuid.Nil {
    27  		_, err = tx.NewDelete().
    28  			Model(accessToken).
    29  			Where("user_id = ?", user.ID).
    30  			Where("client_id = ?", client.ID).
    31  			Where("expires_at <= ?", time.Now()).
    32  			Exec(ctx)
    33  	} else {
    34  		_, err = tx.NewDelete().
    35  			Model(accessToken).
    36  			Where("user_id = uuid_nil()").
    37  			Where("client_id = ?", client.ID).
    38  			Where("expires_at <= ?", time.Now()).
    39  			Exec(ctx)
    40  	}
    41  
    42  	if err != nil {
    43  		tx.Rollback() // rollback the transaction
    44  		return nil, err
    45  	}
    46  
    47  	// Create a new access token
    48  	accessToken = model.NewOauthAccessToken(client, user, expiresIn, scope)
    49  
    50  	_, err = tx.NewInsert().
    51  		Model(accessToken).
    52  		Exec(ctx)
    53  
    54  	if err != nil {
    55  		tx.Rollback() // rollback the transaction
    56  		return nil, err
    57  	}
    58  	accessToken.ClientID = client.ID
    59  
    60  	if user == nil {
    61  		accessToken.UserID = uuid.Nil
    62  	} else {
    63  		accessToken.UserID = user.ID
    64  	}
    65  
    66  	// Commit the transaction
    67  	err = tx.Commit()
    68  	if err != nil {
    69  		tx.Rollback() // rollback the transaction
    70  		return nil, err
    71  	}
    72  
    73  	return accessToken, nil
    74  }