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
- Ensure
prisma_flutter_connector v0.4.0 is published on pub.dev
- Switch
pubspec.yaml from local path to ^0.4.0
- Run
scripts/regenerate-build.sh --prisma after switching
Testing approach
For each migrated file:
dart analyze — zero errors
- Start dart_frog server:
dart build/bin/server.dart
- Curl each affected endpoint with a valid JWT
- 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
Context
PR #105 (
fix/prisma-v040-migration) migrates the backend toprisma_flutter_connectorv0.4.0. The v0.4.0 release (teetangh/prisma-flutter-connector#34) fixes 11 issues including:@default(uuid/cuid)auto-generation viagen_random_uuid()explicitToJson: true)groupBy()method in generated delegates_normalizeForJsonin delegates convertsDateTime→ ISO8601 strings beforefromJsonschema_registry.g.dartrelationPathdeep filtersWhat's done in PR #105:
Uuid().v4()removals across 8 repos_groupByStatus→ SQLGROUP BYdefaultValue: 'uuid()'on all ID fieldsWhat remains: 30 files with 308
JsonQueryBuilderusages 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)
feedback_repository.dartcreateFeedbackstill uses JQB for data map;getFeedbackByUserIdalready on delegaterecording_repository.dartmaintenance_repository.dartannouncement_repository.dartwaitlist_repository.dartaccount_repository.dartpayout_account_repository.dartconsultee_profile_repository.dartTier 2: Medium complexity — Some advanced features (~12 files, ~100 usages)
refund_repository.darttrial_repository.dartdispute_repository.dartconsultant_profile_repository.dartconsultant_verification_repository.dartverification_repository.dartmeeting_session_repository.dartsession_repository.dartuser_repository.dartreview_repository.dartcollaborator_repository.dartdomain_repository.dartTier 3: Complex — Keep JsonQueryBuilder for advanced queries (~10 files, ~178 usages)
appointment_repository.dartdashboard_repository.dart_calculateTotalSpent(raw aggregate), consultant dashboardplan_repository.dartsupport_ticket_repository.dartprograms_repository.dartslot_repository.dartcheckout_repository.dartconsultant_explore_repository.dartreferral_repository.dartTechnical Implementation Plan
For Tier 1 (simple repos):
For Tier 2 (medium repos):
findMany/findFirst/create/update/deletemethods to delegatesinclude(),ComputedField, orFilterOperatorsFor Tier 3 (complex repos):
ComputedField,FilterOperators.relationPath,executeInTransactionwith multiple queries, raw SQLappointment_repository.dart(86 usages) is the largest and should be done lastPrerequisites
prisma_flutter_connectorv0.4.0 is published on pub.devpubspec.yamlfrom local path to^0.4.0scripts/regenerate-build.sh --prismaafter switchingTesting approach
For each migrated file:
dart analyze— zero errorsdart build/bin/server.dartJWT token generation (for testing):
Acceptance Criteria
dart analyzepasses with zero errorsJsonQueryBuildercount < 200 (from current 308)