Automatic Master Angler Submission System
Overview
Similar to the Personal Best (PB) system, the Master Angler system automatically detects when a user's catch qualifies for their state's Master Angler program and creates a submission record. This allows users to easily track and submit qualifying catches to official state programs.
How It Works
1. Automatic Detection
When a catch is logged, the system automatically:
- Determines State: Uses GPS location (latitude/longitude) to find which state the catch occurred in
- Finds Program: Looks up active Master Angler program for that state
- Checks Requirements: Compares catch size (length/weight) against species requirements
- Creates Submission: If qualified, automatically creates a submission record
// After catch is logged
var detectionService = serviceProvider.GetRequiredService<MasterAnglerDetectionService>();
var submission = await detectionService.CheckAndCreateSubmissionAsync(
userId,
fishingLogEntryId,
catchDetailId,
latitude,
longitude);
if (submission != null)
{
// Catch qualifies! Submission created automatically
// User can now submit to official program via SubmissionUrl
}
2. State Detection
The system uses multiple methods to determine state:
- Zone Lookup: Checks if catch location is within a fishing zone's radius
- Bounding Box: Checks if location is within zone's bounding box
- Polygon Zones: Uses point-in-polygon algorithm for complex zone boundaries
- Reverse Geocoding: (Future) Could use reverse geocoding API as fallback
3. Qualification Check
A catch qualifies if it meets the species requirements:
- Length Requirement: Catch length >= minimum length for species
- Weight Requirement: Catch weight >= minimum weight (if applicable)
- Length OR Weight: Some programs allow qualification by either length OR weight
// Example: Michigan Master Angler
// Walleye: 28 inches OR 10 lbs
// If catch is 27 inches but 11 lbs, it still qualifies
4. Submission Creation
When a catch qualifies:
- Submission Record: Created automatically in database
- Status: Set to
Pending(user must submit to official program) - User Notification: User is notified of qualification (TODO: implement)
- Auto-Submission: If program supports API, can auto-submit (TODO: implement)
Master Angler Program Configuration
Submission URL
Each program has a SubmissionUrl that links to the official submission portal:
var program = new MasterAnglerProgram
{
StateId = michiganState.Id,
ProgramName = "Master Angler",
SubmissionUrl = "https://www.michigan.gov/dnr/managing-resources/fishing/master-angler/submit",
// ... other fields
};
Auto-Submission Support
Some programs may support API-based auto-submission:
var program = new MasterAnglerProgram
{
// ... other fields
SubmissionApiUrl = "https://api.dnr.state.gov/master-angler/submit",
SubmissionApiKey = "encrypted-api-key",
SupportsAutoSubmission = true
};
Usage Examples
Check Qualification After Catch
// In your catch logging endpoint/service
public async Task<CatchDetail> LogCatchAsync(
Guid userId,
Guid fishingLogEntryId,
int catchDetailId,
double latitude,
double longitude)
{
// ... save catch ...
// Check for Master Angler qualification
var detectionService = serviceProvider.GetRequiredService<MasterAnglerDetectionService>();
var submission = await detectionService.CheckAndCreateSubmissionAsync(
userId,
fishingLogEntryId,
catchDetailId,
latitude,
longitude);
if (submission != null)
{
// Notify user
await notificationService.SendMasterAnglerQualificationAsync(userId, submission);
}
return catchDetail;
}
Get User's Submissions
var detectionService = serviceProvider.GetRequiredService<MasterAnglerDetectionService>();
var submissions = await detectionService.GetUserSubmissionsAsync(userId);
// Filter by state
var michiganSubmissions = await detectionService.GetUserSubmissionsAsync(
userId,
stateId: michiganState.Id);
Get Program Details
var program = await detectionService.GetProgramForStateAsync(michiganState.Id);
if (program != null)
{
Console.WriteLine($"Program: {program.ProgramName}");
Console.WriteLine($"Submit at: {program.SubmissionUrl}");
Console.WriteLine($"Species: {program.Species.Count}");
}
User Flow
- User Catches Fish: Logs catch with location, species, size
- System Detects: Automatically checks if catch qualifies
- Submission Created: If qualified, submission record created
- User Notified: User receives notification about qualification
- User Submits: User clicks link to official submission portal (
SubmissionUrl) - Status Updated: User can update submission status when official program responds
Future Enhancements
- Auto-Submission: Automatically submit to official programs via API
- Photo Upload: Pre-fill submission form with catch photos
- Status Sync: Sync submission status from official program API
- Reminders: Remind users to submit qualifying catches
- Achievement Badges: Award badges for Master Angler submissions
- Social Sharing: Share Master Angler achievements on social media
Integration Points
Catch Logging Service
// After catch is saved
await masterAnglerDetectionService.CheckAndCreateSubmissionAsync(
userId,
fishingLogEntryId,
catchDetailId,
latitude,
longitude);
Notification Service
// When submission is created
await notificationService.SendMasterAnglerQualificationAsync(userId, submission);
API Endpoints
GET /api/master-angler/submissions- Get user's submissionsGET /api/master-angler/program/{stateId}- Get program for statePOST /api/master-angler/submit/{submissionId}- Submit to official programPUT /api/master-angler/submission/{submissionId}/status- Update submission status
Database Schema
MasterAnglerSubmission
UserId: User who caught the fishProgramId: Master Angler programFishingLogEntryId: Link to catch log entryCatchDetailId: Link to catch detailsFishSpeciesId: Species caughtStatus: Pending, UnderReview, Accepted, Rejected, etc.IsQualified: Whether catch meets requirementsAutoSubmitted: Whether automatically submitted to official programUserNotified: Whether user was notified
MasterAnglerProgram
StateId: State this program is forProgramName: Name of program (e.g., "Master Angler")SubmissionUrl: URL to official submission portalSubmissionApiUrl: API endpoint for auto-submission (if available)SupportsAutoSubmission: Whether API supports auto-submission