Implements support for both individual persons and organizations as members. Changes: - Added MemberType enum (INDIVIDUAL, ORGANIZATION) to distinguish member types - Added member_type column to database (defaults to INDIVIDUAL for backward compatibility) - Added company_name field for organizations - Made first_name nullable (required for individuals, optional for organizations) - Implemented conditional validation: - INDIVIDUAL members require first_name - ORGANIZATION members require company_name - Updated GraphQL schema with new memberType and companyName fields - Updated all resolvers to handle new fields and validation - Added comprehensive unit tests for validation logic - Updated existing tests to work with new fields - All 53 tests passing Technical notes: - Using memberType instead of 'kind' to avoid GraphQL introspection conflicts - Using native_enum=False for SQLite compatibility - Using batch_alter_table for SQLite ALTER COLUMN compatibility - Backward compatible: existing members automatically become INDIVIDUAL type 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
11 lines
740 B
Markdown
11 lines
740 B
Markdown
# Tasks: Support Organization Members
|
|
|
|
- [x] Create database migration to add `member_type` and `company_name` and make `first_name` nullable <!-- id: 0 -->
|
|
- [x] Update SQLAlchemy `Member` model with new fields and validation logic <!-- id: 1 -->
|
|
- [x] Update Pydantic schemas / GraphQL inputs to support new fields (`memberType`, `companyName`) <!-- id: 2 -->
|
|
- [x] Update `createMember` and `updateMember` resolvers with conditional validation <!-- id: 3 -->
|
|
- [x] Update tests to cover new scenarios (organization creation, validation rules) <!-- id: 4 -->
|
|
- [x] Verify backward compatibility for existing individual members <!-- id: 5 -->
|
|
|
|
**Note**: Using `memberType` field name (not `kind`) to avoid GraphQL introspection conflicts.
|