Skip to content

Migration: Replace remaining 308 JsonQueryBuilder usages with typed delegates #106

Description

@teetangh

Context

PR #105 (fix/prisma-v040-migration) migrates the backend to prisma_flutter_connector v0.4.0. The v0.4.0 release (teetangh/prisma-flutter-connector#34) fixes 11 issues including:

What's done in PR #105:

  • 12 manual Uuid().v4() removals across 8 repos
  • Dashboard: in-Dart _groupByStatus → SQL GROUP BY
  • Appointment: nested include workaround cleanup
  • Schema registry: defaultValue: 'uuid()' on all ID fields
  • Code regenerated with v0.4.0 generator (347 files)
  • Integration-tested: POST/GET feedback, dashboard stats, consultants (nested includes + computed), domains

What remains: 30 files with 308 JsonQueryBuilder usages that should be migrated to typed delegates where possible.

Remaining Files (sorted by complexity)

Tier 1: Simple CRUD — Direct typed delegate replacement (~8 files, ~30 usages)

File Usages Notes
feedback_repository.dart 1 createFeedback still uses JQB for data map; getFeedbackByUserId already on delegate
recording_repository.dart 1 Already mostly on delegates
maintenance_repository.dart 1 Simple findFirst
announcement_repository.dart 1 Simple findMany
waitlist_repository.dart 4 Basic CRUD
account_repository.dart 4 Basic CRUD
payout_account_repository.dart 5 Basic CRUD
consultee_profile_repository.dart 5 Basic CRUD + update

Tier 2: Medium complexity — Some advanced features (~12 files, ~100 usages)

File Usages Notes
refund_repository.dart 5 Includes, transactions
trial_repository.dart 6 Includes, status filtering
dispute_repository.dart 6 Includes, pagination
consultant_profile_repository.dart 6 Includes, computed fields
consultant_verification_repository.dart 6 Transactions, includes
verification_repository.dart 7 Token-based lookups
meeting_session_repository.dart 7 Includes, transactions
session_repository.dart 7 Auth token queries
user_repository.dart 9 Includes, nested profile access
review_repository.dart 10 Includes, computed fields, pagination
collaborator_repository.dart 8 Deep includes (3-level)
domain_repository.dart 8 ComputedField.count, includes

Tier 3: Complex — Keep JsonQueryBuilder for advanced queries (~10 files, ~178 usages)

File Usages Notes
appointment_repository.dart 86 Transactions, FilterOperators.relationPath, ComputedFields, conflict checking, raw SQL
dashboard_repository.dart 23 Already migrated groupBy; remaining: _calculateTotalSpent (raw aggregate), consultant dashboard
plan_repository.dart 18 4 plan types × CRUD, cross-plan queries
support_ticket_repository.dart 14 Pagination, includes, response creation
programs_repository.dart 13 Class/webinar management, status updates
slot_repository.dart 12 Availability, conflict detection, FilterOperators
checkout_repository.dart 12 Payment flow, transactions, discount codes
consultant_explore_repository.dart 11 ComputedField.min/first, FilterOperators.relationPath, pagination
referral_repository.dart 8 Transactions, counter updates

Technical Implementation Plan

For Tier 1 (simple repos):

// BEFORE (JsonQueryBuilder):
final query = JsonQueryBuilder()
    .model('Waitlist')
    .action(QueryAction.findMany)
    .where({'userId': userId})
    .orderBy({'createdAt': 'desc'})
    .build();
final results = await executeQueryAsMaps(query);

// AFTER (typed delegate):
final results = await _prisma.waitlist.findMany(
  where: WaitlistWhereInput(userId: StringFilter(equals: userId)),
  orderBy: WaitlistOrderByInput(createdAt: SortOrder.desc),
);
return results.map((w) => w.toJson()).toList();

For Tier 2 (medium repos):

  • Convert simple findMany/findFirst/create/update/delete methods to delegates
  • Keep JQB for methods that use include(), ComputedField, or FilterOperators
  • Each method should be tested via curl after conversion

For Tier 3 (complex repos):

  • Do NOT convert methods using: ComputedField, FilterOperators.relationPath, executeInTransaction with multiple queries, raw SQL
  • DO convert simple CRUD helper methods within these files
  • The appointment_repository.dart (86 usages) is the largest and should be done last

Prerequisites

  1. Ensure prisma_flutter_connector v0.4.0 is published on pub.dev
  2. Switch pubspec.yaml from local path to ^0.4.0
  3. Run scripts/regenerate-build.sh --prisma after switching

Testing approach

For each migrated file:

  1. dart analyze — zero errors
  2. Start dart_frog server: dart build/bin/server.dart
  3. Curl each affected endpoint with a valid JWT
  4. Verify response matches pre-migration behavior

JWT token generation (for testing):

dart run tool/gen_test_token.dart  # outputs JWT for test_intg_cbj_cnt user
USER_ID=test_intg_cbj_cte dart run tool/gen_token_for.dart  # for consultee user

Acceptance Criteria

  • All Tier 1 repos migrated to typed delegates
  • All Tier 2 repos: simple methods migrated, complex methods documented
  • Tier 3 repos: simple CRUD methods migrated where safe
  • dart analyze passes with zero errors
  • Integration tests pass for all migrated endpoints
  • Final JsonQueryBuilder count < 200 (from current 308)

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions