Commit Graph

71 Commits

Author SHA1 Message Date
9eb9b41061 feat: implement server-side image compression with sharp and cleanup RLS policies 2025-12-18 22:08:28 +01:00
d26ebc0b2e fix(query): resolve PostgREST grouping error in SessionList 2025-12-18 21:48:25 +01:00
17727243be feat: add global auth listener with hard reload on logout 2025-12-18 21:45:27 +01:00
6f32bfa17f feat: add visual eyecatcher to session detail header 2025-12-18 21:38:10 +01:00
ec9468f671 fix: resolve dynamic server usage error in debug-admin API route 2025-12-18 21:33:57 +01:00
42d8191c1a fix(pwa): add visibilitychange listener for Android sleep issues 2025-12-18 21:28:46 +01:00
087292f65d feat: improve PWA auth robustness and session management 2025-12-18 21:27:00 +01:00
409e78f2f4 feat: add docker healthcheck for Coolify 2025-12-18 21:19:08 +01:00
7008bbfd84 feat: social UI optimization, collapsible sections, and admin fixes 2025-12-18 21:16:09 +01:00
a64e8f17a1 feat: session deletion, improved tasting deletion visibility, and PWA login loop fix 2025-12-18 21:02:44 +01:00
a4a9d79c4c docker speeeeed 2025-12-18 20:45:37 +01:00
c63a348e6b fix: add defensive fallbacks for missing database relationships 2025-12-18 20:35:38 +01:00
68ac7a515e new 2025-12-18 17:40:20 +01:00
fea964b781 chore: add pnpm onlyBuiltDependencies 2025-12-18 17:37:30 +01:00
4051c40960 add dockerfile 2025-12-18 17:31:48 +01:00
869c8fe9c5 feat: add stop session button and update walkthrough 2025-12-18 17:20:49 +01:00
ca1621e765 feat: refine session workflow with global state, quick tasting, and statistics 2025-12-18 17:19:38 +01:00
7f600698e4 feat: modernize search filters & intelligent label shortening
- Introduced shortenCategory utility to strip redundant terms from labels
- Refactored BottleGrid filters into a compact, collapsible layout
- Added filter count indicator and improved chip styling
- Fully localized new filter UI elements
2025-12-18 16:46:39 +01:00
9464d56055 perf: optimize RLS policies (consolidate and wrap auth calls) 2025-12-18 16:36:30 +01:00
22db65d109 chore: security hardening, mobile PWA fix & analysis expansion
- Applied strict RLS and auth validation to tracking/credit services
- Set Service Worker to Network First to fix mobile session/loading issues
- Expanded Gemini analysis summary to show distilled/bottled/batch info
- Updated SQL schema document with hardening policies
2025-12-18 16:29:16 +01:00
a503e1a317 feat: expand camera analysis display with new fields
- Added distilled date, bottled date, and batch info to the analysis result summary in CameraCapture
- These fields now appear only if Gemini successfully identifies them from the photo
2025-12-18 16:10:50 +01:00
0f56c8b0f4 feat: add gallery upload and fix mobile header issues
- Added 'Upload from Gallery' button to CameraCapture component
- Implemented secondary file input without 'capture' attribute to allow gallery selection on mobile
- Fixed overlapping header elements on mobile by making the header responsive
- Compacted 'Dram of the Day' button on small screens
- Added translations for the new gallery upload feature
2025-12-18 15:48:11 +01:00
960fa89fc1 fix: resolve relationship error in admin dashboard
- Fetched api_usage and profiles separately to avoid Supabase join errors when relationships are not explicitly defined in the schema cache.
- Updated Gemini AI tracking integration to ensure all calls are recorded correctly.
- Improved error handling in admin dashboard.
2025-12-18 15:43:40 +01:00
f25aad401e fix: add debug info to recent API calls display
Added total count display and error message output to help debug
why API calls are logged but not displayed in the UI.
2025-12-18 15:39:46 +01:00
1cfa9cab8c feat: add Gemini AI tracking and fix admin dashboard
- Integrated API tracking into analyze-bottle service
- Added credit balance check before Gemini API calls
- Deduct credits after successful Gemini analysis
- Track both successful and failed Gemini API calls
- Added debug logging to admin dashboard for recent API calls
- Fixed error handling in analyze-bottle

Now tracks both Google Search and Gemini AI API usage!
2025-12-18 15:35:02 +01:00
b18f8907a3 feat: add plan assignment to user management
- Added plan dropdown to user edit modal
- Shows current plan with highlighted card
- Allows admin to assign/change user's subscription plan
- Loads user's current plan when opening edit modal
- Updates plan via setUserPlan service
- Visual feedback with success/error messages

Admins can now:
- View user's current subscription plan
- Assign users to different plans (Starter, Bronze, Silver, Gold)
- See plan details (credits/month, price) in dropdown

This completes the subscription plan system!
2025-12-18 15:29:13 +01:00
e1108addce debug: add extensive logging to subscription service
Added debug logs to getAllPlans to diagnose Bad Gateway error.
Logs will show in terminal when /admin/plans is accessed.
2025-12-18 15:25:39 +01:00
42b4b2b2e1 feat: implement subscription plan system with monthly credits
- Database schema:
  * subscription_plans table - stores plan tiers (Starter, Bronze, Silver, Gold)
  * user_subscriptions table - assigns users to plans
  * Default plans created (10, 50, 100, 250 credits/month)
  * All existing users assigned to Starter plan

- Subscription service (subscription-service.ts):
  * getAllPlans() - fetch all plans
  * getActivePlans() - fetch active plans for users
  * createPlan() - admin creates new plan
  * updatePlan() - admin edits plan
  * deletePlan() - admin removes plan
  * getUserSubscription() - get user's current plan
  * setUserPlan() - admin assigns user to plan
  * grantMonthlyCredits() - distribute credits to all users

- Plan management interface (/admin/plans):
  * Visual plan cards with credits, price, description
  * Create/Edit/Delete plans
  * Toggle active/inactive status
  * Sort order management
  * Grant monthly credits button (manual trigger)

- Features:
  * Monthly credit allocation based on plan
  * Prevents duplicate credit grants (tracks last_credit_grant_at)
  * Admin can manually trigger monthly credit distribution
  * Plans can be activated/deactivated
  * Custom pricing and credit amounts per plan

- UI:
  * Beautiful plan cards with color coding
  * Modal for create/edit with validation
  * Success/error messages
  * Manage Plans button in admin dashboard

Ready for future automation (cron job for monthly credits)
and payment integration (Stripe/PayPal).
2025-12-18 15:16:44 +01:00
f83243fd90 fix: remove auth.admin dependency for user listing
Replaced auth.admin.listUsers() with profile-based approach
to avoid service role key requirement. Shows partial user ID
as placeholder for email. Added debug logging.
2025-12-18 15:14:00 +01:00
95a8b3940b feat: implement comprehensive credits management system
- Database schema:
  * Extended user_credits table with daily_limit, API costs, last_reset_at
  * Created credit_transactions table for full audit trail
  * Added RLS policies for secure access control

- Core services:
  * credit-service.ts - balance checking, deduction, addition, transaction history
  * admin-credit-service.ts - admin controls for managing users and credits

- API integration:
  * Integrated credit checking into discover-whiskybase.ts
  * Credits deducted after successful API calls
  * Insufficient credits error handling

- Admin interface:
  * /admin/users page with user management
  * Statistics dashboard (total users, credits in circulation, usage)
  * Interactive user table with search
  * Edit modal for credit adjustment and settings
  * Per-user daily limits and API cost configuration

- Features:
  * Automatic credit initialization (100 credits for new users)
  * Credit transaction logging with balance_after tracking
  * Admin can add/remove credits with reason
  * Admin can set custom daily limits per user
  * Admin can set custom API costs per user
  * Low credit warnings (< 10 credits)
  * Full transaction history

- User experience:
  * Credits checked before API calls
  * Clear error messages for insufficient credits
  * Graceful handling of credit deduction failures

System is ready for future enhancements like credit packages,
auto-recharge, and payment integration.
2025-12-18 15:02:32 +01:00
e960d1bace fix: resolve infinite recursion in admin_users RLS policy
The admin_users policy was checking if user is admin by querying
the same table, causing infinite recursion. Changed to allow users
to view their own admin record directly using auth.uid() = user_id.

This fixes the error: 'infinite recursion detected in policy for
relation admin_users'
2025-12-18 14:11:22 +01:00
7d307ac253 fix: add missing i18n translation key and admin debug logs
- Added common.all translation key to de.ts and en.ts
- Added debug logging to admin page for troubleshooting access issues
2025-12-18 14:07:25 +01:00
0bc6d8226e fix: remove problematic DATE() index from api_usage table
PostgreSQL requires functions in indexes to be marked IMMUTABLE.
Removed idx_api_usage_user_date composite index that used DATE().
Remaining indexes (user_id, api_type, created_at) still provide
good query performance for daily limit checks.
2025-12-18 13:59:14 +01:00
dd27cfe0e7 feat: implement API usage tracking and admin dashboard
- Added database schema for API tracking system:
  * api_usage table - tracks all Google Search and Gemini AI calls
  * user_credits table - prepared for future credits system
  * admin_users table - controls admin dashboard access
- Created comprehensive tracking service (track-api-usage.ts):
  * trackApiUsage() - records API calls with success/failure
  * checkDailyLimit() - enforces 80 Google Search calls/day limit
  * getUserApiStats() - per-user statistics
  * getGlobalApiStats() - app-wide statistics (admin only)
  * checkIsAdmin() - server-side authorization
- Integrated tracking into discover-whiskybase.ts:
  * Pre-call limit checking with friendly error messages
  * Post-call usage tracking for success and failures
  * User authentication verification
- Built admin dashboard at /admin:
  * Global statistics cards (total, today, by API type)
  * Top 10 users by API usage
  * Recent activity log with 50 latest calls
  * Color-coded status indicators
  * Secure access with RLS policies
- Features:
  * Daily limit resets at midnight Europe/Berlin timezone
  * Graceful error handling (allows on tracking failure)
  * Comprehensive indexes for fast queries
  * Ready for future credits/monetization system
2025-12-18 13:56:21 +01:00
334bece471 feat: implement comprehensive i18n system with German and English support
- Created type-safe i18n system with TranslationKeys interface
- Added German (de) and English (en) translations with 160+ keys
- Implemented I18nContext provider and useI18n hook
- Added LanguageSwitcher component for language selection
- Refactored all major components to use translations:
  * Home page, StatsDashboard, DramOfTheDay
  * BottleGrid, EditBottleForm, CameraCapture
  * BuddyList, SessionList, TastingNoteForm
  * StatusSwitcher and bottle management features
- Implemented locale-aware currency formatting (EUR)
- Implemented locale-aware date formatting
- Added localStorage persistence for language preference
- Added automatic browser language detection
- Organized translations into 8 main categories
- System is extensible for additional languages
2025-12-18 13:44:48 +01:00
acf02a78dd feat: enhance bottle metadata with distillation/bottling dates and batch info 2025-12-18 13:24:41 +01:00
61a7966579 refactor: use GEMINI_API_KEY for Google Search as well 2025-12-18 12:59:35 +01:00
ddf352dab6 feat: switch Whiskybase discovery to Google Custom Search JSON API 2025-12-18 12:43:48 +01:00
fef1c4a275 feat: implement automated Whiskybase ID discovery 2025-12-18 12:40:57 +01:00
35c2443473 feat: implement QOL features (Stats, Search, Dram of the Day) 2025-12-18 12:34:51 +01:00
7d395392d1 nix standalone 2025-12-18 12:22:34 +01:00
970dabbbf6 feat: add bottle editing and purchase price tracking 2025-12-18 12:16:01 +01:00
6e09300bab feat: enforce 12-hour limit for active tasting sessions 2025-12-18 12:12:20 +01:00
e3af71c584 feat: complete bottle-to-session integration flow 2025-12-18 12:08:24 +01:00
a4b7045200 feat: re-introduce regression testing suite with pnpm 2025-12-18 12:03:24 +01:00
d386bb9825 feat: add HEIC image support for iPhone uploads 2025-12-18 12:01:31 +01:00
e339585e3a fix: restore missing imports in CameraCapture 2025-12-18 11:52:07 +01:00
5f757d7b56 feat: implement Save & Taste flow in CameraCapture 2025-12-18 11:49:40 +01:00
2685176992 chore: clean up diagnostic logs and update walkthrough 2025-12-18 11:32:16 +01:00
5923dd0474 fix: resolve RLS infinite recursion in tastings and sessions 2025-12-18 11:24:04 +01:00