Moved the Config struct (previously in internal/models/config.go) into internal/platform/config/types.go to align with clean architecture principles.
This change decouples runtime/infrastructure configuration from domain models:
- Configuration is an application/platform concern, not part of the business domain.
- Prevents potential circular imports between models and platform packages.
- Simplifies future integration with platform components (SCS sessions, CSRF, DB).
No functional changes to configuration loading structure and JSON schema remain the same; only the package location and imports were updated.
- Added route + handler: GenerateInviteLinkHandler to create signed tokens
- Added handler: JoinSyndicateWithTokenHandler to join using invite token
- Integrated secure token generation via helpers.GenerateSecureToken()
- Created DB model: syndicate_invite_tokens (assumed pre-existing)
- Updated syndicate view template to allow managers to generate links
- Flash messaging for invite success/failure
- Invite links are scoped to manager role and valid for 48 hours
- Implemented `CreateSyndicate` with transaction support
- Added `InviteToSyndicate` with membership check and invite insert
- Created syndicate invite model and DB logic for accepting/declining
- Ensured consistent error handling with `fmt.Errorf`
- Cleaned up unused invite handlers/routes
- Added `RestoreMessageHandler` and route at `/account/messages/restore`
- Updated `users_messages` table to support `archived_at` reset
- Added restore button to archived messages template
- Ensures archived messages can be moved back into inbox
- Added `RestoreMessageHandler` and route at `/account/messages/restore`
- Updated `users_messages` table to support `archived_at` reset
- Added restore button to archived messages template
- Ensures archived messages can be moved back into inbox
- Implemented message inbox and archived messages view
- Added pagination logic to both inbox and archive handlers
- Integrated message sending functionality with CSRF protection
- Updated schema to include `archived_at` timestamp
- Included archive button and logic with feedback flash messaging
- Fixed message dropdown routing and rendering in topbar
- Cleaned up template load paths and error handling
Added users_messages schema with correct field naming (senderId, recipientId)
Implemented message count and recent message fetch via storage.GetMessageCount and GetRecentMessages
Fixed field mismatches in SQL queries (recipientId vs recipient_id)
Displayed unread message badge in topbar with truncation for body preview
Linked messages in dropdown to full view (/account/messages/read?id=...)
Added fallback handling for unauthorized/invalid message access
Cleaned up BuildTemplateData to support full message context
Ensured CSRF/session/user context remains intact throughout
Implemented message retrieval and read logic in storage layer
Added handlers for inbox and individual message view
Integrated messages into topbar dropdown with unread badge
Added truncate helper to template functions
Created new templates: messages/index.html and messages/read.html
Fixed missing template function error in topbar rendering
- Replaced http.Error with helpers.RenderError in Recover middleware
- Custom 500.html now rendered with layout and topbar on panic
- RenderError gracefully checks template existence and falls back to plain response
- Added /account/notifications full view page (index)
- Linked "Back to notifications" from notification read view
- Fixed typo in template path for notifications/index.html
- Improved layout consistency across error and account pages