critical priority low complexity backend pending backend specialist Tier 7

Acceptance Criteria

BulkRegistrationRequest contains: List<BulkParticipantEntry> participants and shared ActivityData (type, date, duration)
BulkParticipantEntry contains peer_mentor_id and any participant-specific overrides
BulkParticipantConflict contains peer_mentor_id, the conflicting activity ID, conflicting date, and conflict type
BulkConflictSummary contains List<BulkParticipantConflict> conflicts and List<BulkParticipantEntry> cleanParticipants
BulkRegistrationSuccess contains committed_count (int) and List<String> created_activity_ids
BulkRegistrationResult is a sealed union with variants: BulkRegistrationConflictsDetected(BulkConflictSummary), BulkRegistrationSuccess, BulkRegistrationError
All types are immutable (freezed or const constructors) and implement equality and copyWith
All types are serializable to/from JSON for potential caching or logging use
Type definitions compile without errors and are importable from both the service and BLoC layers

Technical Requirements

frameworks
Flutter
BLoC
data models
BulkRegistrationRequest
BulkParticipantEntry
BulkParticipantConflict
BulkConflictSummary
BulkRegistrationSuccess
BulkRegistrationResult
performance requirements
Type definitions must be lightweight with no runtime overhead — pure value objects only
security requirements
peer_mentor_id fields must be typed as non-nullable UUID strings — no raw dynamic types
No sensitive personal data (names, contact info) stored in conflict types — use IDs only, resolve display names in the UI layer
ui components
Conflict review list widget (reads from BulkConflictSummary)
Bulk success confirmation widget (reads committed_count from BulkRegistrationSuccess)

Execution Context

Execution Tier
Tier 7

Tier 7 - 84 tasks

Can start after Tier 6 completes

Dependencies (10)
epic-proxy-activity-registration-core-services-task-001 component Cross-Epic Component bulk-registration-service depends on proxy-duplicate-detection-service
epic-proxy-activity-registration-core-services-task-002 component Cross-Epic Component bulk-registration-service depends on proxy-duplicate-detection-service
epic-proxy-activity-registration-core-services-task-003 component Cross-Epic Component bulk-registration-service depends on proxy-duplicate-detection-service
epic-proxy-activity-registration-core-services-task-008 component Cross-Epic Component bulk-registration-service depends on proxy-duplicate-detection-service
epic-proxy-activity-registration-core-services-task-004 component Cross-Epic Component bulk-registration-service depends on activity-attribution-service
epic-proxy-activity-registration-core-services-task-005 component Cross-Epic Component bulk-registration-service depends on activity-attribution-service
epic-proxy-activity-registration-core-services-task-006 component Cross-Epic Component bulk-registration-service depends on activity-attribution-service
epic-proxy-activity-registration-core-services-task-007 component Cross-Epic Component bulk-registration-service depends on activity-attribution-service
epic-proxy-activity-registration-core-services-task-009 component Cross-Epic Component bulk-registration-service depends on activity-attribution-service
epic-proxy-activity-registration-core-services-task-010 component Cross-Epic Component bulk-registration-service depends on activity-attribution-service
Dependents (18)
epic-proxy-activity-registration-ui-task-001 component Cross-Epic Component bulk-participant-list depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-002 component Cross-Epic Component bulk-participant-list depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-003 component Cross-Epic Component bulk-participant-list depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-004 component Cross-Epic Component duplicate-warning-dialog depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-005 component Cross-Epic Component duplicate-warning-dialog depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-006 component Cross-Epic Component duplicate-warning-dialog depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-007 component Cross-Epic Component proxy-peer-mentor-selector depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-008 component Cross-Epic Component proxy-peer-mentor-selector depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-009 component Cross-Epic Component proxy-peer-mentor-selector depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-010 component Cross-Epic Component proxy-activity-form depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-011 component Cross-Epic Component proxy-activity-form depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-012 component Cross-Epic Component proxy-registration-screen depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-013 component Cross-Epic Component proxy-registration-screen depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-014 component Cross-Epic Component proxy-registration-screen depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-015 component Cross-Epic Component bulk-registration-screen depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-016 component Cross-Epic Component bulk-registration-screen depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-017 component Cross-Epic Component bulk-registration-screen depends on bulk-registration-service
epic-proxy-activity-registration-ui-task-018 component Cross-Epic Component proxy-registration-bloc depends on bulk-registration-service

Implementation Notes

Use the freezed package for all domain types to get immutability, equality, copyWith, and JSON serialization for free. Define BulkRegistrationResult as a sealed class with three variants. Place all type definitions in a single file (e.g. bulk_registration_types.dart) under the domain layer — this makes the contract easy to discover and review.

Ensure BulkConflictSummary is designed so the UI can render a 'review' screen showing: (a) how many will be submitted, (b) a list of conflicts with peer mentor name lookup by ID. Keep the types decoupled from Supabase-specific types — no SupabaseResponse or PostgresException should appear in domain types. These types should be stable contracts between the service layer and the BLoC; avoid adding convenience methods that belong in the service.

Testing Requirements

Write unit tests using flutter_test verifying: (1) BulkRegistrationRequest serializes and deserializes correctly; (2) BulkConflictSummary correctly separates clean participants from conflicted ones; (3) BulkRegistrationResult sealed variants are exhaustively matchable; (4) freezed equality works correctly for all types (two instances with same data are equal); (5) copyWith on BulkParticipantEntry produces correct partial updates. No mocking required — these are pure data type tests.

Component
Bulk Registration Service
service high
Epic Risks (3)
high impact low prob integration

If the Supabase batch RPC partial-inserts some records before encountering an error and does not roll back cleanly, the bulk service may report failure while orphaned records exist in the database, corrupting reporting data.

Mitigation & Contingency

Mitigation: Wrap the bulk insert in an explicit Supabase transaction via the RPC function. Write an integration test that simulates a mid-batch constraint violation and asserts zero records were written.

Contingency: If a partial-write incident occurs, the registered_by audit field allows identification and deletion of the orphaned records. Implement a coordinator-facing bulk submission status screen to surface any such anomalies.

medium impact medium prob scope

When a bulk submission of 15 participants has 4 duplicates, the aggregated conflict summary may be too complex for coordinators to process quickly, leading to blanket override decisions that defeat the purpose of duplicate detection.

Mitigation & Contingency

Mitigation: Design the conflict result type to support per-participant override flags, so the UI can present a clear list of conflicting participants with individual cancel/override toggles rather than a single global decision.

Contingency: If coordinator usability testing reveals the conflict review screen is too complex, simplify to a 'skip all conflicts and submit the rest' mode as an immediate fallback while a more granular UI is designed.

high impact low prob security

If the coordinator role check inside proxy-registration-service is inconsistent with the route-level guard, a regression in the guard could allow peer mentors to call the service directly via deep links, submitting records with incorrect attribution.

Mitigation & Contingency

Mitigation: Enforce role authorization at both the route guard level (coordinator-role-guard) and inside each service method independently. Write a security test that calls the service directly with a peer mentor session token and asserts rejection.

Contingency: If a bypass is discovered, immediately enable the server-side RLS policy as the final enforcement layer and audit any records written during the exposure window using the registered_by field.