mirror of
https://github.com/jcreek/SvelteKitSaasBoilerplate.git
synced 2026-07-13 11:03:49 +00:00
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:
@@ -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 };
|
||||
};
|
||||
@@ -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>
|
||||
@@ -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 });
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user