-
Notifications
You must be signed in to change notification settings - Fork 0
Labels
enhancementNew feature or requestNew feature or requestgood first issueGood for newcomersGood for newcomers
Description
Summary
Implement a super admin endpoint that returns applicant emails filtered by decision status (accepted, rejected, waitlisted). This supports bulk email sending workflows — e.g., sending acceptance/rejection notifications.
Endpoint
GET /v1/superadmin/applications/emails?status=accepted
Auth: Requires super_admin role (behind RequireRoleMiddleware(store.RoleSuperAdmin))
Query Parameters
| Param | Type | Required | Description |
|---|---|---|---|
status |
string | Yes | One of: accepted, rejected, waitlisted |
Validation
statusis required- Must be one of the three decision statuses (
accepted,rejected,waitlisted) —draftandsubmittedare not valid filters for this endpoint
Response
200 OK
{
"data": {
"emails": ["alice@utdallas.edu", "bob@utdallas.edu"],
"count": 2
}
}emails— flat array of email strings for all applicants matching the statuscount— total number of emails returned
400 Bad Request — missing or invalid status parameter
403 Forbidden — caller is not a super admin
Implementation Details
Files to modify/create
| File | Change |
|---|---|
internal/store/storage.go |
Add GetEmailsByStatus(ctx context.Context, status ApplicationStatus) ([]string, error) to the Application interface |
internal/store/applications.go |
Implement GetEmailsByStatus (see query below) |
cmd/api/applications.go |
Add getApplicantEmailsByStatusHandler handler |
cmd/api/api.go |
Register r.Get("/applications/emails", app.getApplicantEmailsByStatusHandler) under the super admin route group |
Store query
SELECT u.email
FROM applications a
INNER JOIN users u ON a.user_id = u.id
WHERE a.status = $1
ORDER BY u.email- The
idx_applications_statusindex already exists onapplications(status), so filtering is fast users.emailisCITEXT(case-insensitive), ordering by email gives a consistent, predictable result- No pagination needed — response is a lightweight flat array of strings. Even 1,000+ emails is a small payload
Handler logic
- Read
statusquery parameter - Validate it is one of:
accepted,rejected,waitlisted - Call
store.Application.GetEmailsByStatus(ctx, status) - Return
{ "emails": [...], "count": N }
Route registration
r.Route("/superadmin", func(r chi.Router) {
// ... existing routes ...
r.Get("/applications/emails", app.getApplicantEmailsByStatusHandler)
})Acceptance Criteria
-
GetEmailsByStatusadded to Application store interface and implemented -
GET /v1/superadmin/applications/emails?status=handler created - Validates status is one of accepted/rejected/waitlisted
- Returns flat email array with count
- Only accessible to super admins
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or requestgood first issueGood for newcomersGood for newcomers