(ctx context.Context, tx *storage.Connection, userData *provider.UserProvidedData, instanceID uuid.UUID, inviteToken, providerType string)
| 219 | } |
| 220 | |
| 221 | func (a *API) processInvite(ctx context.Context, tx *storage.Connection, userData *provider.UserProvidedData, instanceID uuid.UUID, inviteToken, providerType string) (*models.User, error) { |
| 222 | config := a.getConfig(ctx) |
| 223 | user, err := models.FindUserByConfirmationToken(tx, inviteToken) |
| 224 | if err != nil { |
| 225 | if models.IsNotFoundError(err) { |
| 226 | return nil, notFoundError(err.Error()) |
| 227 | } |
| 228 | return nil, internalServerError("Database error finding user").WithInternalError(err) |
| 229 | } |
| 230 | |
| 231 | var emailData *provider.Email |
| 232 | var emails []string |
| 233 | for _, e := range userData.Emails { |
| 234 | emails = append(emails, e.Email) |
| 235 | if user.Email == e.Email { |
| 236 | emailData = &e |
| 237 | break |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | if emailData == nil { |
| 242 | return nil, badRequestError("Invited email does not match emails from external provider").WithInternalMessage("invited=%s external=%s", user.Email, strings.Join(emails, ", ")) |
| 243 | } |
| 244 | |
| 245 | if err := user.UpdateAppMetaData(tx, map[string]interface{}{ |
| 246 | "provider": providerType, |
| 247 | }); err != nil { |
| 248 | return nil, internalServerError("Database error updating user").WithInternalError(err) |
| 249 | } |
| 250 | |
| 251 | updates := make(map[string]interface{}) |
| 252 | for k, v := range userData.Metadata { |
| 253 | if v != "" { |
| 254 | updates[k] = v |
| 255 | } |
| 256 | } |
| 257 | if err := user.UpdateUserMetaData(tx, updates); err != nil { |
| 258 | return nil, internalServerError("Database error updating user").WithInternalError(err) |
| 259 | } |
| 260 | |
| 261 | if err := models.NewAuditLogEntry(tx, instanceID, user, models.InviteAcceptedAction, nil); err != nil { |
| 262 | return nil, err |
| 263 | } |
| 264 | if err := triggerEventHooks(ctx, tx, SignupEvent, user, instanceID, config); err != nil { |
| 265 | return nil, err |
| 266 | } |
| 267 | |
| 268 | // confirm because they were able to respond to invite email |
| 269 | if err := user.Confirm(tx); err != nil { |
| 270 | return nil, err |
| 271 | } |
| 272 | return user, nil |
| 273 | } |
| 274 | |
| 275 | func (a *API) loadExternalState(ctx context.Context, state string) (context.Context, error) { |
| 276 | claims := ExternalProviderClaims{} |
no test coverage detected