From ca566494f54a4b1b2098ff51a46fb74c567eb5b3 Mon Sep 17 00:00:00 2001 From: Kai Haase Date: Fri, 6 Feb 2026 01:17:44 +0100 Subject: [PATCH] 11.13.2: Add BetterAuthRolesGuard to fix DI issues with AuthGuard mixin in autoRegister:false mode --- .claude/rules/better-auth.md | 136 +++++ migration-guides/11.12.x-to-11.13.0.md | 16 + package-lock.json | 4 +- package.json | 2 +- spectaql.yml | 2 +- src/config.env.ts | 15 +- src/core.module.ts | 122 +++- .../interfaces/server-options.interface.ts | 39 ++ src/core/modules/auth/core-auth.module.ts | 12 +- src/core/modules/auth/guards/roles.guard.ts | 45 +- src/core/modules/better-auth/CUSTOMIZATION.md | 520 ++++++++++++++++++ .../better-auth/INTEGRATION-CHECKLIST.md | 15 + src/core/modules/better-auth/README.md | 25 +- .../better-auth/better-auth-roles.guard.ts | 205 +++++++ .../core-better-auth-api.middleware.ts | 6 + .../better-auth/core-better-auth.module.ts | 95 +++- src/core/modules/better-auth/index.ts | 1 + ...better-auth-autoregister-false.e2e-spec.ts | 230 ++++++++ ...etter-auth-module-registration.e2e-spec.ts | 361 ++++++++++++ 19 files changed, 1824 insertions(+), 27 deletions(-) create mode 100644 src/core/modules/better-auth/CUSTOMIZATION.md create mode 100644 src/core/modules/better-auth/better-auth-roles.guard.ts create mode 100644 tests/stories/better-auth-autoregister-false.e2e-spec.ts create mode 100644 tests/stories/better-auth-module-registration.e2e-spec.ts diff --git a/.claude/rules/better-auth.md b/.claude/rules/better-auth.md index 1011f58..4832093 100644 --- a/.claude/rules/better-auth.md +++ b/.claude/rules/better-auth.md @@ -117,6 +117,140 @@ When changes affect existing test expectations: 3. **Update test** to match new correct behavior 4. **Document** why the test was changed in commit message +## 4. Customization Patterns + +When a project needs custom BetterAuth behavior, follow these patterns: + +### Module Registration Patterns + +| Pattern | Use When | Configuration | +|---------|----------|---------------| +| **Zero-Config** | No customization needed | `CoreModule.forRoot(envConfig)` | +| **Config-based** | Custom Controller/Resolver | `betterAuth: { controller, resolver }` in config | +| **Separate Module** | Full control, additional providers | `betterAuth: { autoRegister: false }` | + +### Pattern Selection Decision Tree + +1. Does the project need custom Controller or Resolver? + - No → Use Zero-Config (Pattern 1) + - Yes → Continue to 2 + +2. Does the project need additional providers or complex module structure? + - No → Use Config-based (Pattern 2) - add `controller`/`resolver` to `betterAuth` config + - Yes → Use Separate Module (Pattern 3) - set `autoRegister: false` + +### Critical: Resolver Decorator Re-declaration + +When customizing the Resolver, **ALL decorators MUST be re-declared**: + +```typescript +// WRONG - method won't appear in GraphQL schema! +override async betterAuthSignUp(...) { + return super.betterAuthSignUp(...); +} + +// CORRECT - all decorators re-declared +@Mutation(() => BetterAuthAuthModel) +@Roles(RoleEnum.S_EVERYONE) +override async betterAuthSignUp(...) { + return super.betterAuthSignUp(...); +} +``` + +**Why:** GraphQL schema is built from decorators at compile time. Parent class is `isAbstract: true`. + +### Email Template Customization + +Templates are resolved in order: +1. `