Merge pull request #38 from jcreek/37-enable-tracking-usage-of-credits

37 Enable tracking credits usage with proof of concept test page
This commit is contained in:
Josh Creek
2024-10-08 21:08:12 +01:00
committed by GitHub
7 changed files with 352 additions and 1 deletions
@@ -0,0 +1,18 @@
import { redirect } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
export const load: PageServerLoad = async ({ locals: { supabase, safeGetSession } }) => {
const { session } = await safeGetSession();
if (!session) {
redirect(303, '/');
}
const { data: user } = await supabase
.from('users')
.select(`name, id`)
.eq('id', session.user.id)
.single();
return { session, user };
};
+93
View File
@@ -0,0 +1,93 @@
<script lang="ts">
import { onMount } from 'svelte';
import { writable } from 'svelte/store';
export let data;
let { session, supabase, user } = data;
$: ({ session, supabase, user } = data);
const credits = writable<number>(0);
let errorMessage: string = '';
onMount(async () => {
try {
const pageUserId = user?.id;
if (pageUserId) {
const response = await fetch('/test/test-credits', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'getUserCredits', userId: pageUserId })
});
if (!response.ok) throw new Error('Failed to fetch credits');
const { credits: fetchedCredits } = await response.json();
credits.set(fetchedCredits);
}
} catch (error) {
errorMessage = error.message;
}
});
const addCredits = async () => {
try {
const response = await fetch('/test/test-credits', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
action: 'addCredits',
userId: user?.id,
credits: 10,
description: 'Test add credits'
})
});
if (!response.ok) throw new Error('Failed to add credits');
const { credits: updatedCredits } = await response.json();
credits.set(updatedCredits);
} catch (error) {
errorMessage = error.message;
}
};
const deductCredits = async () => {
try {
const response = await fetch('/test/test-credits', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
action: 'deductCredits',
userId: user?.id,
credits: 5,
description: 'Test deduct credits'
})
});
if (!response.ok) throw new Error('Failed to deduct credits');
const { credits: updatedCredits } = await response.json();
credits.set(updatedCredits);
} catch (error) {
errorMessage = error.message;
}
};
</script>
<main>
<h1>Credits Management for User: {user?.id}</h1>
<p>Credits Remaining: {$credits}</p>
{#if errorMessage}
<p style="color: red;">{errorMessage}</p>
{/if}
<button on:click={addCredits}>Add 10 Credits</button>
<button on:click={deductCredits}>Deduct 5 Credits</button>
</main>
<style>
main {
text-align: center;
padding: 2rem;
}
button {
margin: 0.5rem;
padding: 0.5rem 1rem;
cursor: pointer;
}
</style>
+29
View File
@@ -0,0 +1,29 @@
import { json } from '@sveltejs/kit';
import { addCredits, deductCredits, getUserCredits } from '$lib/utils/supabase/admin';
export const POST = async ({ request }) => {
const { action, userId, credits, description } = await request.json();
if (!userId) {
return json({ success: false, error: 'User ID is required' }, { status: 400 });
}
try {
if (action === 'addCredits') {
await addCredits(userId, credits, description);
const updatedCredits = await getUserCredits(userId);
return json({ success: true, credits: updatedCredits });
} else if (action === 'deductCredits') {
await deductCredits(userId, credits, description);
const updatedCredits = await getUserCredits(userId);
return json({ success: true, credits: updatedCredits });
} else if (action === 'getUserCredits') {
const fetchedCredits = await getUserCredits(userId);
return json({ success: true, credits: fetchedCredits });
} else {
return json({ success: false, error: 'Invalid action' }, { status: 400 });
}
} catch (error) {
return json({ success: false, error: error.message }, { status: 500 });
}
};