[PR #8112] [CLOSED] fix(core): resolve user/account modelName collisions in adapter mapping and joins #15999

Closed
opened 2026-04-13 10:20:39 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/better-auth/better-auth/pull/8112
Author: @dilame
Created: 2/23/2026
Status: Closed

Base: mainHead: codex/fix-model-collision-join-resolution


📝 Commits (1)

  • fce3f70 fix(core): resolve model-name collisions across adapter mapping and joins

📊 Changes

11 files changed (+180 additions, -37 deletions)

View changed files

📝 packages/core/src/db/adapter/factory.ts (+15 -13)
📝 packages/core/src/db/adapter/get-default-field-name.ts (+3 -1)
📝 packages/core/src/db/adapter/get-default-model-name.ts (+6 -6)
📝 packages/core/src/db/adapter/get-field-name.ts (+1 -1)
📝 packages/core/src/db/adapter/get-model-name.ts (+3 -13)
📝 packages/core/src/db/get-tables.ts (+5 -3)
packages/core/src/db/test/factory-join.test.ts (+55 -0)
packages/core/src/db/test/get-default-model-name.test.ts (+23 -0)
packages/core/src/db/test/get-field-name.test.ts (+29 -0)
packages/core/src/db/test/get-model-name.test.ts (+24 -0)
📝 packages/core/src/db/test/get-tables.test.ts (+16 -0)

📄 Description

Summary

This PR fixes schema/model resolution edge cases when user.modelName collides with the default account model key (for example: user.modelName = "account", account.modelName = "identity").

What changed

  • getDefaultModelName: prefer reverse lookup by modelName before schema-key lookup to correctly map DB model names back to base keys.
  • getModelName: prefer explicit schema key when provided, then resolve by model-name fallback.
  • getDefaultFieldName / getFieldName: prefer explicit schema key before reverse model lookup.
  • adapter/factory join transformation: use schema-key-aware resolution for base/join/reference model resolution and field mapping.
  • getAuthTables: keep FK references targeting the base user key (not custom user.modelName) to avoid broken relations in adapter join logic.

Tests

Added regression tests covering collisions and joins:

  • src/db/test/get-default-model-name.test.ts
  • src/db/test/get-model-name.test.ts
  • src/db/test/get-field-name.test.ts
  • src/db/test/factory-join.test.ts
  • updated src/db/test/get-tables.test.ts with user-reference assertions

Verification

Executed:

pnpm --filter @better-auth/core exec vitest run
src/db/test/get-default-model-name.test.ts
src/db/test/get-model-name.test.ts
src/db/test/get-field-name.test.ts
src/db/test/get-tables.test.ts
src/db/test/factory-join.test.ts

All passed.


Summary by cubic

Fixes model-name collisions between schema keys and custom model names (e.g., user → account) so adapters resolve models, fields, and joins correctly. Foreign key references now consistently point to the base “user” key to prevent broken relations.

  • Bug Fixes
    • Model resolution: prefer the explicit schema key; otherwise resolve by modelName to avoid user/account collisions.
    • Field resolution: use schema key-aware lookup in getFieldName/getDefaultFieldName.
    • Joins: resolve base and joined models via schema keys; compute on.from/on.to using the correct model.
    • Auth tables: keep FK references targeting the “user” base key even when user.modelName changes.

Written for commit fce3f70b97. Summary will update on new commits.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/better-auth/better-auth/pull/8112 **Author:** [@dilame](https://github.com/dilame) **Created:** 2/23/2026 **Status:** ❌ Closed **Base:** `main` ← **Head:** `codex/fix-model-collision-join-resolution` --- ### 📝 Commits (1) - [`fce3f70`](https://github.com/better-auth/better-auth/commit/fce3f70b97c65deb279fabffa3d3f31b56149a42) fix(core): resolve model-name collisions across adapter mapping and joins ### 📊 Changes **11 files changed** (+180 additions, -37 deletions) <details> <summary>View changed files</summary> 📝 `packages/core/src/db/adapter/factory.ts` (+15 -13) 📝 `packages/core/src/db/adapter/get-default-field-name.ts` (+3 -1) 📝 `packages/core/src/db/adapter/get-default-model-name.ts` (+6 -6) 📝 `packages/core/src/db/adapter/get-field-name.ts` (+1 -1) 📝 `packages/core/src/db/adapter/get-model-name.ts` (+3 -13) 📝 `packages/core/src/db/get-tables.ts` (+5 -3) ➕ `packages/core/src/db/test/factory-join.test.ts` (+55 -0) ➕ `packages/core/src/db/test/get-default-model-name.test.ts` (+23 -0) ➕ `packages/core/src/db/test/get-field-name.test.ts` (+29 -0) ➕ `packages/core/src/db/test/get-model-name.test.ts` (+24 -0) 📝 `packages/core/src/db/test/get-tables.test.ts` (+16 -0) </details> ### 📄 Description ## Summary This PR fixes schema/model resolution edge cases when user.modelName collides with the default account model key (for example: user.modelName = "account", account.modelName = "identity"). ## What changed - getDefaultModelName: prefer reverse lookup by modelName before schema-key lookup to correctly map DB model names back to base keys. - getModelName: prefer explicit schema key when provided, then resolve by model-name fallback. - getDefaultFieldName / getFieldName: prefer explicit schema key before reverse model lookup. - adapter/factory join transformation: use schema-key-aware resolution for base/join/reference model resolution and field mapping. - getAuthTables: keep FK references targeting the base user key (not custom user.modelName) to avoid broken relations in adapter join logic. ## Tests Added regression tests covering collisions and joins: - src/db/test/get-default-model-name.test.ts - src/db/test/get-model-name.test.ts - src/db/test/get-field-name.test.ts - src/db/test/factory-join.test.ts - updated src/db/test/get-tables.test.ts with user-reference assertions ## Verification Executed: pnpm --filter @better-auth/core exec vitest run \ src/db/test/get-default-model-name.test.ts \ src/db/test/get-model-name.test.ts \ src/db/test/get-field-name.test.ts \ src/db/test/get-tables.test.ts \ src/db/test/factory-join.test.ts All passed. <!-- This is an auto-generated description by cubic. --> --- ## Summary by cubic Fixes model-name collisions between schema keys and custom model names (e.g., user → account) so adapters resolve models, fields, and joins correctly. Foreign key references now consistently point to the base “user” key to prevent broken relations. - **Bug Fixes** - Model resolution: prefer the explicit schema key; otherwise resolve by modelName to avoid user/account collisions. - Field resolution: use schema key-aware lookup in getFieldName/getDefaultFieldName. - Joins: resolve base and joined models via schema keys; compute on.from/on.to using the correct model. - Auth tables: keep FK references targeting the “user” base key even when user.modelName changes. <sup>Written for commit fce3f70b97c65deb279fabffa3d3f31b56149a42. Summary will update on new commits.</sup> <!-- End of auto-generated description by cubic. --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-04-13 10:20:39 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/better-auth#15999