(params: ProcessCredentialDraftParams)
| 21 | * Used by Better Auth's `account.create.after` hook and custom OAuth flows (Shopify, Trello). |
| 22 | */ |
| 23 | export async function processCredentialDraft(params: ProcessCredentialDraftParams): Promise<void> { |
| 24 | const { userId, providerId, accountId } = params |
| 25 | |
| 26 | const [draft] = await db |
| 27 | .select() |
| 28 | .from(schema.pendingCredentialDraft) |
| 29 | .where( |
| 30 | and( |
| 31 | eq(schema.pendingCredentialDraft.userId, userId), |
| 32 | eq(schema.pendingCredentialDraft.providerId, providerId), |
| 33 | sql`${schema.pendingCredentialDraft.expiresAt} > NOW()` |
| 34 | ) |
| 35 | ) |
| 36 | .limit(1) |
| 37 | |
| 38 | if (!draft) return |
| 39 | |
| 40 | const now = new Date() |
| 41 | |
| 42 | if (draft.credentialId) { |
| 43 | await handleReconnectCredential({ |
| 44 | draft, |
| 45 | newAccountId: accountId, |
| 46 | workspaceId: draft.workspaceId, |
| 47 | userId, |
| 48 | now, |
| 49 | }) |
| 50 | } else { |
| 51 | await handleCreateCredentialFromDraft({ |
| 52 | draft, |
| 53 | accountId, |
| 54 | providerId, |
| 55 | userId, |
| 56 | now, |
| 57 | }) |
| 58 | } |
| 59 | |
| 60 | await db |
| 61 | .delete(schema.pendingCredentialDraft) |
| 62 | .where(eq(schema.pendingCredentialDraft.id, draft.id)) |
| 63 | |
| 64 | logger.info('Processed credential draft', { |
| 65 | draftId: draft.id, |
| 66 | userId, |
| 67 | providerId, |
| 68 | isReconnect: Boolean(draft.credentialId), |
| 69 | }) |
| 70 | } |
no test coverage detected