mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-11-01 18:19:43 +00:00
Add match archiving, chat enhancements, and daily limits
- Match archives with swipe-to-archive and unread filtering - Chat settings sheet and full-screen media modals - Match notification modal for new matches - Admin AI settings with model/provider configuration - Daily response limit feature with recommended questions - New test coverage for stores, hooks, and components - Claude Code agent and command configurations Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
595d6bd394
commit
b0f1700e40
57 files changed
+8359
-1661
No files matched your search
@@ -0,0 +1,77 @@
|
||||
-- Add daily response limit for non-premium users
|
||||
-- This feature limits how many questions a non-premium user can answer per UTC day
|
||||
|
||||
-- Add daily_response_limit column to app_config
|
||||
ALTER TABLE app_config
|
||||
ADD COLUMN daily_response_limit INTEGER DEFAULT 0;
|
||||
|
||||
COMMENT ON COLUMN app_config.daily_response_limit IS 'Maximum number of questions a non-premium user can answer per UTC day. Set to 0 to disable daily limits.';
|
||||
|
||||
-- ============================================================================
|
||||
-- RPC FUNCTION: get_daily_response_limit_status
|
||||
-- Returns the current daily response limit status for the authenticated user
|
||||
-- ============================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION get_daily_response_limit_status()
|
||||
RETURNS TABLE(
|
||||
responses_today INTEGER,
|
||||
limit_value INTEGER,
|
||||
remaining INTEGER,
|
||||
reset_at TIMESTAMPTZ,
|
||||
is_blocked BOOLEAN
|
||||
)
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = 'public'
|
||||
AS $$
|
||||
DECLARE
|
||||
v_user_id UUID;
|
||||
v_has_premium BOOLEAN;
|
||||
v_limit INTEGER;
|
||||
v_count INTEGER;
|
||||
v_today_start TIMESTAMPTZ;
|
||||
v_tomorrow_start TIMESTAMPTZ;
|
||||
BEGIN
|
||||
v_user_id := auth.uid();
|
||||
|
||||
-- Get limit from app_config
|
||||
SELECT COALESCE(ac.daily_response_limit, 0) INTO v_limit
|
||||
FROM app_config ac
|
||||
LIMIT 1;
|
||||
|
||||
-- If limit is 0, feature is disabled
|
||||
IF v_limit = 0 THEN
|
||||
RETURN QUERY SELECT 0, 0, 0, NULL::TIMESTAMPTZ, false;
|
||||
RETURN;
|
||||
END IF;
|
||||
|
||||
-- Check if user has premium access (user or partner)
|
||||
v_has_premium := public.has_premium_access(v_user_id);
|
||||
|
||||
-- Premium users bypass the limit
|
||||
IF v_has_premium THEN
|
||||
RETURN QUERY SELECT 0, 0, 0, NULL::TIMESTAMPTZ, false;
|
||||
RETURN;
|
||||
END IF;
|
||||
|
||||
-- Calculate UTC day boundaries
|
||||
v_today_start := date_trunc('day', NOW() AT TIME ZONE 'UTC') AT TIME ZONE 'UTC';
|
||||
v_tomorrow_start := v_today_start + INTERVAL '1 day';
|
||||
|
||||
-- Count responses created today (UTC)
|
||||
SELECT COUNT(*)::INTEGER INTO v_count
|
||||
FROM responses r
|
||||
WHERE r.user_id = v_user_id
|
||||
AND r.created_at >= v_today_start
|
||||
AND r.created_at < v_tomorrow_start;
|
||||
|
||||
RETURN QUERY SELECT
|
||||
v_count,
|
||||
v_limit,
|
||||
GREATEST(0, v_limit - v_count),
|
||||
v_tomorrow_start,
|
||||
(v_count >= v_limit);
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION get_daily_response_limit_status() IS 'Returns daily response limit status for the current user. Premium users and disabled limits return is_blocked=false.';
|
||||
Reference in new issue
Block a user