(tx *storage.Connection, user *User, oldToken *RefreshToken, params *GrantParams)
| 173 | } |
| 174 | |
| 175 | func createRefreshToken(tx *storage.Connection, user *User, oldToken *RefreshToken, params *GrantParams) (*RefreshToken, error) { |
| 176 | token := &RefreshToken{ |
| 177 | UserID: user.ID, |
| 178 | Token: crypto.SecureAlphanumeric(12), |
| 179 | Parent: "", |
| 180 | } |
| 181 | if oldToken != nil { |
| 182 | token.Parent = storage.NullString(oldToken.Token) |
| 183 | token.SessionId = oldToken.SessionId |
| 184 | } |
| 185 | |
| 186 | if token.SessionId == nil { |
| 187 | session, err := NewSession(user.ID, params.FactorID) |
| 188 | if err != nil { |
| 189 | return nil, errors.Wrap(err, "error instantiating new session object") |
| 190 | } |
| 191 | |
| 192 | session.ApplyGrantParams(params) |
| 193 | |
| 194 | if err := tx.Create(session); err != nil { |
| 195 | return nil, errors.Wrap(err, "error creating new session") |
| 196 | } |
| 197 | |
| 198 | token.SessionId = &session.ID |
| 199 | } |
| 200 | |
| 201 | if err := tx.Create(token); err != nil { |
| 202 | return nil, errors.Wrap(err, "error creating refresh token") |
| 203 | } |
| 204 | |
| 205 | if err := user.UpdateLastSignInAt(tx); err != nil { |
| 206 | return nil, errors.Wrap(err, "error update user`s last_sign_in field") |
| 207 | } |
| 208 | return token, nil |
| 209 | } |
no test coverage detected