github.com/RichardKnop/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 }