Surveys - Developer Guide
This guide covers the technical architecture, database schema, and implementation details of the Survey feature in Pawtograder.Overview
The survey system allows instructors to create custom surveys, collect student responses, and analyze feedback. It uses SurveyJS for the question builder and renderer.Architecture
Tech Stack
Key Dependencies
Database Schema
Tables
surveys
Main table storing survey definitions.
survey_series
Stores survey series for trend analysis.
assignment_groups
Updated to include mentor assignments.
survey_responses
Stores individual student responses.
survey_assignments
Maps surveys to specific students (when not assigned to all).
survey_templates
Reusable survey templates.
Enum Types
Database Triggers
RPC Functions
soft_delete_survey(p_survey_id UUID, p_survey_logical_id UUID)
Atomically soft-deletes a survey and all its responses.
create_survey_assignments(p_survey_id UUID, p_profile_ids UUID[])
Bulk creates survey assignments for specific students.
get_survey_status_for_assignment(p_assignment_id BIGINT, p_profile_id UUID)
Returns survey completion status for a student on a specific assignment.
get_survey_responses_with_group_context(p_class_id BIGINT, p_survey_id UUID)
Aggregates survey responses with group and mentor information for analytics.
Row Level Security (RLS)
Survey Policies
Response Policies
TypeScript Types
File Structure
SurveyJS Integration
Rendering Surveys
Survey JSON Structure
Supported Question Types
Response Handling
Saving Responses
Auto-save on Value Change
Whenallow_response_editing is enabled, responses are auto-saved:
CSV Export
The export functionality includes security protections against CSV injection:Testing
E2E Tests
Survey E2E tests are located attests/e2e/surveys.test.tsx.
Manual Testing
- Create a test class with
npm run seed - Log in as an instructor
- Navigate to Surveys to test CRUD operations
- Log in as a student to test survey taking
Common Development Tasks
Adding a New Question Type
-
Update
SurveyBuilderDataTypes.ts: -
Update the builder UI in
SurveyBuilder.tsx -
Add rendering support in
Survey.tsx(usually automatic via SurveyJS)
Modifying the Database Schema
-
Create a new migration:
-
Write your SQL in
supabase/migrations/[timestamp]_your_migration_name.sql -
Apply locally:
-
Regenerate types:
Adding RLS Policies
Troubleshooting
Survey not appearing for students
- Check survey status is
published - Verify
deleted_atis NULL - If using specific assignments, confirm student is in
survey_assignments - Check RLS policies are not blocking access
Response not saving
- Verify the student’s
profile_idmatches their class enrollment - Check for unique constraint violations (duplicate responses)
- Verify
is_submittedtrigger is working
Visual Builder not updating JSON
- Check browser console for JavaScript errors
- Verify
onChangecallback is properly wired - Check for JSON serialization issues in
serde.ts