- Add listing type selection to new listing wizard
- Create SelectingListingType state for choosing between 4 listing types
- Add ListingTypeKeyboardButtons with clear descriptions
- Support BasicAuction, MultiSlotAuction, FixedPriceListing, BlindAuction
- Update handlers to start with type selection before title input
- Improve main menu navigation
- Add main menu with action buttons for /start command
- Create MainMenuButtons with New Listing, My Listings, My Bids, Settings, Help
- Add back button to My Listings screen for better navigation
- Implement proper dialogue state management between screens
- Refactor callback handling for type safety
- Convert string literal matching to enum-based callback handling
- Use try_from() pattern for all keyboard button callbacks
- Ensure compile-time safety and exhaustive matching
- Apply pattern to listing type, slots, duration, and start time callbacks
- Eliminate code duplication
- Extract reusable main menu functions (enter_main_menu, get_main_menu_message)
- Centralize main menu logic and message content
- Update all main menu transitions to use shared functions
- Technical improvements
- Add proper error handling for invalid callback data
- Maintain backward compatibility with existing flows
- Follow established patterns for keyboard button definitions
- Ensure all changes compile without errors
- Created trait abstractions for dependency injection with mockall support
- Added comprehensive integration tests focusing on:
* Database operations and persistence
* Complete user workflow scenarios
* Dialogue state transitions and validation
* Multi-user scenarios and data integrity
- Removed trivial unit tests, kept only meaningful business logic tests
- Added UserRepository, ListingRepository, and BotMessenger traits
- Integration tests verify end-to-end workflows with real database
- Total: 30 focused tests (4 unit + 8 integration + 18 validation tests)
Key integration test scenarios:
- Complete listing creation workflow with database persistence
- Listing update workflows with state validation
- Multi-user independent operations
- Error handling that preserves data integrity
- Business rule enforcement (e.g., no timing changes on live listings)
Framework ready for advanced mock-based testing when needed.
- Reduced code size by 26.7% (1083→810 lines)
- Eliminated ALL duplication patterns:
* Consolidated 12 individual handlers into 2 unified handlers
* Centralized all step messages and success messages into constants
* Removed repetitive pattern matching and state transitions
- Major architectural improvements:
* Refactored ListingFields enum to use struct-based variants
* Enhanced type safety with dedicated field structs
* Simplified field access patterns throughout codebase
- Updated database layer for new enum structure
- Maintained full teloxide compatibility and functionality
- All 112 tests still passing
- Consolidate Create and Save button handling in confirmation flow
- Add unsaved changes indicator to listing summary
- Improve edit flow by using enter_edit_listing_draft function
- Update confirmation button logic and user feedback messages
- Clean up dialogue state management in confirmation handlers
- Support parsing strings like '1 hour', '7 days' in addition to plain numbers
- Maintain backwards compatibility with numeric input (e.g., '24')
- Support units: hour(s), hr(s), day(s)
- Add comprehensive test suite using rstest
- Enforce 1-720 hour limit (1 hour to 30 days)
- Provide clear error messages for invalid input
- Refactor new_listing from single file to modular structure
- Add handler factory pattern for state management
- Improve keyboard utilities and validations
- Update database models for bid, listing, and user systems
- Add new types: listing_duration, user_row_id
- Remove deprecated user_id type
- Update Docker configuration
- Enhance test utilities and message handling
- Fix failing tests by correcting test expectations for parameter extraction
- Add comprehensive coverage including InnerWithMultiStruct variant
- Reduce test duplication using rstest parametrization
- Create assert_handler_result helper function to eliminate repetitive code
- Consolidate similar test patterns into unified test functions
- Ensure all macro functionality is properly tested with clear test case names
All 20 parameterized test cases now pass, covering:
- Simple variant filtering
- Single/multiple parameter extraction from enums
- Nested enum parameter extraction
- Struct field extraction (single and multiple fields)
- Proper negative test cases for non-matching variants
- Extract keyboard utility functions to new keyboard_utils.rs module
- Update new listing command with improved keyboard handling
- Enhance message utilities with better user interaction
- Refactor user ID type handling
- Remove development database file
- Update main.rs with improved structure
- Created edit_html_message utility for consistent message editing
- Converted all bot.edit_message_text() calls to use edit_html_message
- Fixed markdown to HTML conversion (**Error:** → <b>Error:</b>, *text* → <i>text</i>)
- Added MessageId import to fix compilation errors
- 100% message utility adoption achieved - all direct bot message calls eliminated
🔧 Fixed unused validation functions:
- Updated validate_duration() to handle hours (1-720) instead of days to match handler expectations
- Refactored handle_duration_input() to use validate_duration() utility
- Refactored handle_start_time_input() to use validate_start_time() utility
✅ All validation functions now utilized:
- validate_title() ✓ (used in handle_title_input)
- validate_price() ✓ (used in handle_price_input)
- validate_slots() ✓ (used in handle_slots_input)
- validate_duration() ✓ (used in handle_duration_input) - NOW USED
- validate_start_time() ✓ (used in handle_start_time_input) - NOW USED
🎯 Benefits:
- Eliminated all unused validation function warnings
- Consistent validation patterns across ALL input handlers
- Centralized error messages for easier maintenance
- Improved code consistency and maintainability
📊 Final refactoring status: 100% complete
- All input handlers now use validation utilities
- All validation functions are properly utilized
- No more code duplication in validation logic
- Fix handler type mismatch error by properly ordering dialogue entry
- Move .enter_dialogue() before handlers that need dialogue context
- Remove duplicate command handler branches
- Add duration callback handler for inline keyboard buttons
- Add duration keyboard with 1, 3, 7, and 14 day options
- Refactor duration processing into shared function
- Simplify slots keyboard layout to single row
- Improve code organization and error handling
- Replace individual state structs with unified ListingDraft struct
- Add EditingListing state with field selection interface
- Implement individual field editing states (Title, Description, Price, Slots, StartTime, Duration)
- Add field-specific keyboards with Back buttons and Clear functionality for description
- Update all handlers to use ListingDraft instead of separate state structs
- Rename Confirming to ViewingDraft for clarity
- Add proper validation and error handling for all field edits
- Enable seamless navigation between edit screen and confirmation
- Maintain all existing functionality while adding edit capabilities
- Move type files to src/db/types/: currency_type, listing_id, user_id, money_amount, telegram_user_id
- Create types/mod.rs with proper re-exports for all type modules
- Update db/mod.rs to import from new types module instead of individual files
- All tests pass - no functionality changes
- Improves code organization by clearly separating types, DAOs, and models
- Move listing_dao.rs and user_dao.rs to src/db/dao/
- Create dao/mod.rs with proper re-exports for ListingDAO and UserDAO
- Update import paths in DAO files to work from new location
- Update db/mod.rs to import from new dao module
- All tests still pass - no functionality changes
- Add UserId and ListingId newtype wrappers with SQLx integration
- Prevents mixing up different ID types at compile time
- Custom Encode/Decode traits for seamless database operations
- Zero-cost abstractions with full type safety
- Refactor Listing to enum-based architecture
- BasicAuction: Traditional time-based auction with bidding
- MultiSlotAuction: Auction with multiple winners/slots
- FixedPriceListing: Fixed price sale with no bidding
- BlindAuction: Blind auction where seller chooses winner
- ListingBase: Common fields shared by all listing types
- ListingRow: Flat database row structure for SQLx compatibility
- Update ListingType enum variants
- Standard -> BasicAuction
- MultiSlot -> MultiSlotAuction
- FixedPrice -> FixedPriceListing
- Blind -> BlindAuction
- Add comprehensive conversion traits and helper methods
- Maintain full database compatibility with existing schema
- Remove unused helper methods and make base() private for cleaner API
- Remove src/db/money.rs which contained the old Decimal-based MoneyAmount implementation
- This file was leftover from the INTEGER cents refactoring and was not referenced in mod.rs
- Only money_amount.rs with INTEGER storage is now active
- Compilation confirmed successful after removal
- Break down monolithic src/db/models.rs into focused model files
- Create src/db/models/ directory with individual files:
- listing_type.rs - ListingType enum and variants
- user.rs - User struct and NewUser helper
- listing.rs - Listing struct and NewListing helper
- bid.rs - Bid struct and NewBid helper
- proxy_bid.rs - ProxyBid struct and NewProxyBid helper
- listing_media.rs - ListingMedia for file attachments
- user_settings.rs - UserSettings for user preferences
- mod.rs - Re-exports all models for seamless access
- Remove old monolithic models.rs file
- Maintain backward compatibility through re-exports
Benefits:
- Improved code organization and maintainability
- Better separation of concerns for each model
- Easier navigation and IDE support
- Reduced merge conflicts in team development
- Scalable foundation for adding new models
- Refactor MoneyAmount to store as INTEGER cents instead of TEXT decimals
- Move CurrencyType to separate currency_type.rs module
- Rename money.rs to money_amount.rs for clarity
- Update database schema to use INTEGER for all monetary columns
- Remove complex CAST AS REAL workarounds from database queries
- Add comprehensive test coverage for cent-based arithmetic and storage
- Enable STRICT mode and foreign key constraints in SQLite
- Add rstest dependency for parameterized testing
Benefits:
- Faster INTEGER-based comparisons vs TEXT casting
- Exact financial precision without floating-point errors
- Simpler, cleaner SQL queries
- Better performance for auction bid operations
Major Changes:
- Set up SQLx database connection and migration system
- Create complete initial database schema with all tables
- Rename 'auction' to 'listing' throughout codebase for better terminology
- Update bot commands: /newauction -> /newlisting, /myauctions -> /mylistings
- Update all database tables: auctions -> listings, auction_medias -> listing_medias
- Update foreign key relationships and indexes
- Add automatic database migration on startup
- Update documentation and README
- Complete backlog tasks: task-001, task-002, task-010
The bot now has a solid database foundation ready for implementing core business logic.
All tests pass and code compiles successfully.