managarten/chat/apps/mobile/scripts/create_usage_functions.sql
Till-JS c638a7ffee feat(chat): integrate chat project into monorepo with full app structure
- Restructure chat as apps/mobile, apps/web, apps/landing, backend
- Add NestJS backend for secure Azure OpenAI API calls
- Remove exposed API key from mobile app (security fix)
- Add shared chat-types package
- Create SvelteKit web app scaffold
- Create Astro landing page scaffold
- Update pnpm workspace configuration
- Add project-level CLAUDE.md documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 13:48:24 +01:00

144 lines
No EOL
3.7 KiB
PL/PgSQL

-- Funktionen zum Abfragen der Token-Nutzung
-- 1. Funktion zum Abrufen der Token-Nutzung eines Benutzers, gruppiert nach Modell
CREATE OR REPLACE FUNCTION get_user_model_usage(user_id UUID)
RETURNS TABLE (
model_id UUID,
model_name TEXT,
total_prompt_tokens BIGINT,
total_completion_tokens BIGINT,
total_tokens BIGINT,
total_cost DECIMAL(10, 6)
)
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
RETURN QUERY
SELECT
ul.model_id,
m.name AS model_name,
SUM(ul.prompt_tokens)::BIGINT AS total_prompt_tokens,
SUM(ul.completion_tokens)::BIGINT AS total_completion_tokens,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
JOIN
models m ON ul.model_id = m.id
WHERE
ul.user_id = get_user_model_usage.user_id
GROUP BY
ul.model_id, m.name
ORDER BY
total_cost DESC;
END;
$$;
-- 2. Funktion zum Abrufen der Token-Nutzung eines Benutzers nach Zeitraum
CREATE OR REPLACE FUNCTION get_user_usage_by_period(user_id UUID, period TEXT)
RETURNS TABLE (
time_period TEXT,
total_tokens BIGINT,
total_cost DECIMAL(10, 6)
)
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
IF period = 'day' THEN
RETURN QUERY
SELECT
TO_CHAR(ul.created_at, 'YYYY-MM-DD') AS time_period,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
WHERE
ul.user_id = get_user_usage_by_period.user_id
GROUP BY
time_period
ORDER BY
time_period DESC;
ELSIF period = 'month' THEN
RETURN QUERY
SELECT
TO_CHAR(ul.created_at, 'YYYY-MM') AS time_period,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
WHERE
ul.user_id = get_user_usage_by_period.user_id
GROUP BY
time_period
ORDER BY
time_period DESC;
ELSIF period = 'year' THEN
RETURN QUERY
SELECT
TO_CHAR(ul.created_at, 'YYYY') AS time_period,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
WHERE
ul.user_id = get_user_usage_by_period.user_id
GROUP BY
time_period
ORDER BY
time_period DESC;
ELSE
-- Fallback auf tägliche Ansicht
RETURN QUERY
SELECT
TO_CHAR(ul.created_at, 'YYYY-MM-DD') AS time_period,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
WHERE
ul.user_id = get_user_usage_by_period.user_id
GROUP BY
time_period
ORDER BY
time_period DESC;
END IF;
END;
$$;
-- 3. Funktion zum Abrufen der Token-Nutzung einer bestimmten Konversation
CREATE OR REPLACE FUNCTION get_conversation_usage(conversation_id UUID)
RETURNS TABLE (
message_id UUID,
created_at TIMESTAMP WITH TIME ZONE,
prompt_tokens BIGINT,
completion_tokens BIGINT,
total_tokens BIGINT,
estimated_cost DECIMAL(10, 6)
)
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
RETURN QUERY
SELECT
ul.message_id,
ul.created_at,
ul.prompt_tokens::BIGINT,
ul.completion_tokens::BIGINT,
ul.total_tokens::BIGINT,
ul.estimated_cost::DECIMAL(10, 6)
FROM
usage_logs ul
WHERE
ul.conversation_id = get_conversation_usage.conversation_id
ORDER BY
ul.created_at;
END;
$$;
-- Erteile Berechtigungen für die Funktionen
GRANT EXECUTE ON FUNCTION get_user_model_usage TO authenticated;
GRANT EXECUTE ON FUNCTION get_user_usage_by_period TO authenticated;
GRANT EXECUTE ON FUNCTION get_conversation_usage TO authenticated;