Skip to content

feat: implement transactional OAuth onboarding and role provisioning - #127

Open
Yasir-TechGuy wants to merge 1 commit into
Eduvault-stellar:mainfrom
Yasir-TechGuy:91-transactional-oauth-onboarding
Open

feat: implement transactional OAuth onboarding and role provisioning#127
Yasir-TechGuy wants to merge 1 commit into
Eduvault-stellar:mainfrom
Yasir-TechGuy:91-transactional-oauth-onboarding

Conversation

@Yasir-TechGuy

Copy link
Copy Markdown

Feat: Transactional OAuth Onboarding and Role Provisioning

What This PR Does

This PR fixes the OAuth onboarding and role provisioning system to be transactionally consistent. It ensures users never reach the dashboard with an incomplete role state.

What Was The Problem?

  • OAuth callbacks could create duplicate identities
  • Role provisioning could partially fail, leaving users stuck
  • Identity collisions had no safe recovery path
  • Client initialization checks were scattered everywhere

How This Fixes It

1. Onboarding State Machine

Tracks where the user is in the onboarding flow:

  • pending → role_selected → provisioned (success)
  • Or → failed (with retry support)
  • Or → disabled (admin action)

2. Idempotent Identity Creation

  • One identity per user, no matter how many times they click
  • Links OAuth providers to existing accounts
  • Handles email collisions safely

3. Atomic Role Provisioning

  • MongoDB transactions ensure ALL or NOTHING
  • User role + role-specific records created together
  • Full rollback on failure

4. Unified Bootstrap Endpoint

  • Single API call for client initialization
  • Returns auth status, user info, onboarding state, role

5. Integration Tests

Covering: callback retry, concurrent selection, disabled user, and provider linking

Files Created

  • src/lib/db/schemas/onboarding.js - State schema
  • src/lib/auth/identityService.js - Identity creation
  • src/lib/auth/roleProvisioning.js - Role provisioning
  • src/app/api/auth/bootstrap/route.js - Bootstrap endpoint
  • src/app/api/auth/onboarding/role/route.js - Role selection API
  • test/integration/onboarding/role-provisioning.test.js - Tests
  • docs/onboarding-state-machine.md - Documentation

API Endpoints

GET /api/auth/bootstrap - Get user state
POST /api/auth/onboarding/role - Select and provision role

Testing

npm test -- test/integration/onboarding/role-provisioning.test.js

Acceptance Criteria Checklist

  • Replaying OAuth callbacks creates exactly one identity
  • No partial role states reachable
  • Role provisioning commits fully or rolls back fully
  • Identity collisions return safe recovery path
  • Integration tests cover all scenarios
  • Onboarding state diagram documented

Closes

Closes #91

- Add onboarding state schema with state machine (pending, role_selected, provisioned, failed, disabled)
- Implement idempotent identity creation with OAuth provider linking
- Add atomic role provisioning with MongoDB transaction support
- Create unified bootstrap endpoint replacing scattered client init checks
- Add role selection API endpoint for frontend integration
- Add integration tests covering: callback retry, concurrent selection, disabled user, provider linking
- Add documentation for onboarding state machine and recovery procedures

Closes Eduvault-stellar#91
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[AUTH]: Make OAuth onboarding and role provisioning transactionally consistent

1 participant