Spaces:
Running
Running
Pulastya B commited on
Commit ·
4beea60
1
Parent(s): f1c3962
Added a table to store stuff
Browse files- FRRONTEEEND/lib/supabase.ts +51 -57
- supabase_hf_tokens_table.sql +45 -0
FRRONTEEEND/lib/supabase.ts
CHANGED
|
@@ -283,9 +283,9 @@ const withTimeout = <T>(promise: Promise<T>, ms: number, errorMsg: string): Prom
|
|
| 283 |
return Promise.race([promise, timeout]);
|
| 284 |
};
|
| 285 |
|
| 286 |
-
// Update HuggingFace token for a user (
|
| 287 |
export const updateHuggingFaceToken = async (userId: string, hfToken: string, hfUsername?: string) => {
|
| 288 |
-
console.log('[HF Token] Starting
|
| 289 |
|
| 290 |
// Check if Supabase is properly configured
|
| 291 |
if (!isSupabaseConfigured()) {
|
|
@@ -294,89 +294,60 @@ export const updateHuggingFaceToken = async (userId: string, hfToken: string, hf
|
|
| 294 |
}
|
| 295 |
|
| 296 |
try {
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
const { data: { session } } = await withTimeout(
|
| 300 |
-
supabase.auth.getSession(),
|
| 301 |
-
5000,
|
| 302 |
-
'Session check timeout'
|
| 303 |
-
);
|
| 304 |
-
console.log('[HF Token] Session:', session ? `User: ${session.user.id}` : 'NO SESSION');
|
| 305 |
-
|
| 306 |
-
if (!session) {
|
| 307 |
-
console.error('[HF Token] No active Supabase session! RLS will block the query.');
|
| 308 |
-
return null;
|
| 309 |
-
}
|
| 310 |
-
|
| 311 |
-
console.log('[HF Token] Attempting update...');
|
| 312 |
-
|
| 313 |
-
const updateData = {
|
| 314 |
huggingface_token: hfToken || null,
|
| 315 |
huggingface_username: hfUsername || null,
|
| 316 |
updated_at: new Date().toISOString()
|
| 317 |
};
|
| 318 |
-
console.log('[HF Token]
|
| 319 |
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
);
|
| 328 |
|
| 329 |
if (error) {
|
| 330 |
-
console.error('[HF Token]
|
| 331 |
return null;
|
| 332 |
}
|
| 333 |
|
| 334 |
-
console.log('[HF Token]
|
| 335 |
-
return
|
| 336 |
} catch (err: any) {
|
| 337 |
console.error('[HF Token] Error:', err?.message || err);
|
| 338 |
return null;
|
| 339 |
}
|
| 340 |
};
|
| 341 |
|
| 342 |
-
// Get HuggingFace token for a user (
|
| 343 |
export const getHuggingFaceStatus = async (userId: string) => {
|
| 344 |
console.log('[HF Status] Checking HF connection for user:', userId);
|
| 345 |
|
| 346 |
try {
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
'Session check timeout'
|
| 353 |
-
);
|
| 354 |
|
| 355 |
-
if (
|
| 356 |
-
console.
|
| 357 |
return { connected: false };
|
| 358 |
}
|
| 359 |
-
console.log('[HF Status] Session found, querying profile...');
|
| 360 |
-
|
| 361 |
-
const { data, error } = await withTimeout(
|
| 362 |
-
supabase
|
| 363 |
-
.from('user_profiles')
|
| 364 |
-
.select('huggingface_token, huggingface_username')
|
| 365 |
-
.eq('user_id', userId)
|
| 366 |
-
.single(),
|
| 367 |
-
5000,
|
| 368 |
-
'Profile query timeout'
|
| 369 |
-
);
|
| 370 |
|
| 371 |
-
if (
|
| 372 |
-
console.
|
| 373 |
return { connected: false };
|
| 374 |
}
|
| 375 |
|
| 376 |
const result = {
|
| 377 |
-
connected: !!data
|
| 378 |
-
username: data
|
| 379 |
-
tokenMasked: data
|
| 380 |
};
|
| 381 |
|
| 382 |
console.log('[HF Status] Result:', result.connected ? `Connected as ${result.username}` : 'Not connected');
|
|
@@ -387,3 +358,26 @@ export const getHuggingFaceStatus = async (userId: string) => {
|
|
| 387 |
}
|
| 388 |
};
|
| 389 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 283 |
return Promise.race([promise, timeout]);
|
| 284 |
};
|
| 285 |
|
| 286 |
+
// Update HuggingFace token for a user (uses dedicated hf_tokens table)
|
| 287 |
export const updateHuggingFaceToken = async (userId: string, hfToken: string, hfUsername?: string) => {
|
| 288 |
+
console.log('[HF Token] Starting upsert for user:', userId);
|
| 289 |
|
| 290 |
// Check if Supabase is properly configured
|
| 291 |
if (!isSupabaseConfigured()) {
|
|
|
|
| 294 |
}
|
| 295 |
|
| 296 |
try {
|
| 297 |
+
const tokenData = {
|
| 298 |
+
user_id: userId,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 299 |
huggingface_token: hfToken || null,
|
| 300 |
huggingface_username: hfUsername || null,
|
| 301 |
updated_at: new Date().toISOString()
|
| 302 |
};
|
| 303 |
+
console.log('[HF Token] Upsert payload:', { ...tokenData, huggingface_token: hfToken ? '****' : null });
|
| 304 |
|
| 305 |
+
// Use UPSERT - inserts if not exists, updates if exists
|
| 306 |
+
// This is simpler and doesn't require profile to exist first
|
| 307 |
+
const { data, error } = await supabase
|
| 308 |
+
.from('hf_tokens')
|
| 309 |
+
.upsert(tokenData, { onConflict: 'user_id' })
|
| 310 |
+
.select()
|
| 311 |
+
.single();
|
|
|
|
| 312 |
|
| 313 |
if (error) {
|
| 314 |
+
console.error('[HF Token] Upsert failed:', error.message, error.code, error.hint);
|
| 315 |
return null;
|
| 316 |
}
|
| 317 |
|
| 318 |
+
console.log('[HF Token] Upsert successful!');
|
| 319 |
+
return data;
|
| 320 |
} catch (err: any) {
|
| 321 |
console.error('[HF Token] Error:', err?.message || err);
|
| 322 |
return null;
|
| 323 |
}
|
| 324 |
};
|
| 325 |
|
| 326 |
+
// Get HuggingFace token status for a user (from dedicated hf_tokens table)
|
| 327 |
export const getHuggingFaceStatus = async (userId: string) => {
|
| 328 |
console.log('[HF Status] Checking HF connection for user:', userId);
|
| 329 |
|
| 330 |
try {
|
| 331 |
+
const { data, error } = await supabase
|
| 332 |
+
.from('hf_tokens')
|
| 333 |
+
.select('huggingface_token, huggingface_username')
|
| 334 |
+
.eq('user_id', userId)
|
| 335 |
+
.maybeSingle(); // Returns null if not found instead of error
|
|
|
|
|
|
|
| 336 |
|
| 337 |
+
if (error) {
|
| 338 |
+
console.error('[HF Status] Query error:', error.message, error.code);
|
| 339 |
return { connected: false };
|
| 340 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 341 |
|
| 342 |
+
if (!data) {
|
| 343 |
+
console.log('[HF Status] No token found for user');
|
| 344 |
return { connected: false };
|
| 345 |
}
|
| 346 |
|
| 347 |
const result = {
|
| 348 |
+
connected: !!data.huggingface_token,
|
| 349 |
+
username: data.huggingface_username,
|
| 350 |
+
tokenMasked: data.huggingface_token ? `hf_****${data.huggingface_token.slice(-4)}` : null
|
| 351 |
};
|
| 352 |
|
| 353 |
console.log('[HF Status] Result:', result.connected ? `Connected as ${result.username}` : 'Not connected');
|
|
|
|
| 358 |
}
|
| 359 |
};
|
| 360 |
|
| 361 |
+
// Get the actual HuggingFace token (for export functionality)
|
| 362 |
+
export const getHuggingFaceToken = async (userId: string): Promise<string | null> => {
|
| 363 |
+
console.log('[HF Token] Getting full token for user:', userId);
|
| 364 |
+
|
| 365 |
+
try {
|
| 366 |
+
const { data, error } = await supabase
|
| 367 |
+
.from('hf_tokens')
|
| 368 |
+
.select('huggingface_token')
|
| 369 |
+
.eq('user_id', userId)
|
| 370 |
+
.maybeSingle();
|
| 371 |
+
|
| 372 |
+
if (error || !data) {
|
| 373 |
+
console.error('[HF Token] Failed to get token:', error?.message);
|
| 374 |
+
return null;
|
| 375 |
+
}
|
| 376 |
+
|
| 377 |
+
return data.huggingface_token;
|
| 378 |
+
} catch (err: any) {
|
| 379 |
+
console.error('[HF Token] Error:', err?.message || err);
|
| 380 |
+
return null;
|
| 381 |
+
}
|
| 382 |
+
};
|
| 383 |
+
|
supabase_hf_tokens_table.sql
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-- HuggingFace Tokens Table
|
| 2 |
+
-- Run this in your Supabase SQL Editor (supabase.com/dashboard -> SQL Editor)
|
| 3 |
+
|
| 4 |
+
-- Create the hf_tokens table
|
| 5 |
+
CREATE TABLE IF NOT EXISTS hf_tokens (
|
| 6 |
+
user_id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
|
| 7 |
+
huggingface_token TEXT,
|
| 8 |
+
huggingface_username TEXT,
|
| 9 |
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
| 10 |
+
updated_at TIMESTAMPTZ DEFAULT NOW()
|
| 11 |
+
);
|
| 12 |
+
|
| 13 |
+
-- Enable Row Level Security
|
| 14 |
+
ALTER TABLE hf_tokens ENABLE ROW LEVEL SECURITY;
|
| 15 |
+
|
| 16 |
+
-- Drop existing policies if they exist (for re-running)
|
| 17 |
+
DROP POLICY IF EXISTS "Users can view own tokens" ON hf_tokens;
|
| 18 |
+
DROP POLICY IF EXISTS "Users can insert own tokens" ON hf_tokens;
|
| 19 |
+
DROP POLICY IF EXISTS "Users can update own tokens" ON hf_tokens;
|
| 20 |
+
DROP POLICY IF EXISTS "Users can delete own tokens" ON hf_tokens;
|
| 21 |
+
|
| 22 |
+
-- Policy: Users can only SELECT their own tokens
|
| 23 |
+
CREATE POLICY "Users can view own tokens" ON hf_tokens
|
| 24 |
+
FOR SELECT USING (auth.uid() = user_id);
|
| 25 |
+
|
| 26 |
+
-- Policy: Users can only INSERT their own tokens
|
| 27 |
+
CREATE POLICY "Users can insert own tokens" ON hf_tokens
|
| 28 |
+
FOR INSERT WITH CHECK (auth.uid() = user_id);
|
| 29 |
+
|
| 30 |
+
-- Policy: Users can only UPDATE their own tokens
|
| 31 |
+
CREATE POLICY "Users can update own tokens" ON hf_tokens
|
| 32 |
+
FOR UPDATE USING (auth.uid() = user_id);
|
| 33 |
+
|
| 34 |
+
-- Policy: Users can only DELETE their own tokens
|
| 35 |
+
CREATE POLICY "Users can delete own tokens" ON hf_tokens
|
| 36 |
+
FOR DELETE USING (auth.uid() = user_id);
|
| 37 |
+
|
| 38 |
+
-- Create index for faster lookups
|
| 39 |
+
CREATE INDEX IF NOT EXISTS idx_hf_tokens_user_id ON hf_tokens(user_id);
|
| 40 |
+
|
| 41 |
+
-- Grant access to authenticated users
|
| 42 |
+
GRANT ALL ON hf_tokens TO authenticated;
|
| 43 |
+
|
| 44 |
+
-- Success message
|
| 45 |
+
SELECT 'hf_tokens table created successfully!' AS result;
|