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 }