Pulastya B commited on
Commit
4beea60
·
1 Parent(s): f1c3962

Added a table to store stuff

Browse files
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 (only updates existing profiles)
287
  export const updateHuggingFaceToken = async (userId: string, hfToken: string, hfUsername?: string) => {
288
- console.log('[HF Token] Starting update for user:', userId);
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
- // Check if user is authenticated in Supabase (with timeout)
298
- console.log('[HF Token] Getting session...');
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] Update payload:', { ...updateData, huggingface_token: hfToken ? '****' : null });
319
 
320
- const { error } = await withTimeout(
321
- supabase
322
- .from('user_profiles')
323
- .update(updateData)
324
- .eq('user_id', userId),
325
- 8000,
326
- 'Update query timeout'
327
- );
328
 
329
  if (error) {
330
- console.error('[HF Token] Update failed:', error.message, error.code, error.hint);
331
  return null;
332
  }
333
 
334
- console.log('[HF Token] Update successful!');
335
- return { ...updateData, user_id: userId };
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 (returns masked token for security)
343
  export const getHuggingFaceStatus = async (userId: string) => {
344
  console.log('[HF Status] Checking HF connection for user:', userId);
345
 
346
  try {
347
- // Check if user is authenticated (with timeout)
348
- console.log('[HF Status] Getting session...');
349
- const { data: { session } } = await withTimeout(
350
- supabase.auth.getSession(),
351
- 5000,
352
- 'Session check timeout'
353
- );
354
 
355
- if (!session) {
356
- console.log('[HF Status] No session, returning not connected');
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 (error) {
372
- console.error('[HF Status] Query error:', error.message);
373
  return { connected: false };
374
  }
375
 
376
  const result = {
377
- connected: !!data?.huggingface_token,
378
- username: data?.huggingface_username,
379
- tokenMasked: data?.huggingface_token ? `hf_****${data.huggingface_token.slice(-4)}` : null
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;