## What was done: ✅ Fixed Firebase Admin initialization to use default credentials for Firebase Functions ✅ Updated frontend to use correct Firebase Functions URL (was using Cloud Run URL) ✅ Added comprehensive debugging to authentication middleware ✅ Added debugging to file upload middleware and CORS handling ✅ Added debug buttons to frontend for troubleshooting authentication ✅ Enhanced error handling and logging throughout the stack ## Current issues: ❌ Document upload still returns 400 Bad Request despite authentication working ❌ GET requests work fine (200 OK) but POST upload requests fail ❌ Frontend authentication is working correctly (valid JWT tokens) ❌ Backend authentication middleware is working (rejects invalid tokens) ❌ CORS is configured correctly and allowing requests ## Root cause analysis: - Authentication is NOT the issue (tokens are valid, GET requests work) - The problem appears to be in the file upload handling or multer configuration - Request reaches the server but fails during upload processing - Need to identify exactly where in the upload pipeline the failure occurs ## TODO next steps: 1. 🔍 Check Firebase Functions logs after next upload attempt to see debugging output 2. 🔍 Verify if request reaches upload middleware (look for '�� Upload middleware called' logs) 3. 🔍 Check if file validation is triggered (look for '🔍 File filter called' logs) 4. 🔍 Identify specific error in upload pipeline (multer, file processing, etc.) 5. 🔍 Test with smaller file or different file type to isolate issue 6. 🔍 Check if issue is with Firebase Functions file size limits or timeout 7. 🔍 Verify multer configuration and file handling in Firebase Functions environment ## Technical details: - Frontend: https://cim-summarizer.web.app - Backend: https://us-central1-cim-summarizer.cloudfunctions.net/api - Authentication: Firebase Auth with JWT tokens (working correctly) - File upload: Multer with memory storage for immediate GCS upload - Debug buttons available in production frontend for troubleshooting
89 lines
3.3 KiB
JavaScript
89 lines
3.3 KiB
JavaScript
const { createClient } = require('@supabase/supabase-js');
|
|
|
|
// Supabase configuration from environment
|
|
const SUPABASE_URL = 'https://gzoclmbqmgmpuhufbnhy.supabase.co';
|
|
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imd6b2NsbWJxbWdtcHVodWZibmh5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTM4MTY2NzgsImV4cCI6MjA2OTM5MjY3OH0.Jg8cAKbujDv7YgeLCeHsOkgkP-LwM-7fAXVIHno0pLI';
|
|
const SUPABASE_SERVICE_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imd6b2NsbWJxbWdtcHVodWZibmh5Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc1MzgxNjY3OCwiZXhwIjoyMDY5MzkyNjc4fQ.f9PUzL1F8JqIkqD_DwrGBIyHPcehMo-97jXD8hee5ss';
|
|
|
|
async function testSupabaseClient() {
|
|
console.log('Testing Supabase client connection...');
|
|
|
|
try {
|
|
// Test with anon key
|
|
console.log('\n🔍 Testing with anon key...');
|
|
const anonClient = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
|
|
|
|
// Test a simple query
|
|
const { data: anonData, error: anonError } = await anonClient
|
|
.from('users')
|
|
.select('*')
|
|
.limit(1);
|
|
|
|
if (anonError) {
|
|
console.log(`❌ Anon client error: ${anonError.message}`);
|
|
} else {
|
|
console.log(`✅ Anon client working! Found ${anonData?.length || 0} users`);
|
|
}
|
|
|
|
// Test with service key
|
|
console.log('\n🔍 Testing with service key...');
|
|
const serviceClient = createClient(SUPABASE_URL, SUPABASE_SERVICE_KEY);
|
|
|
|
// Test a simple query
|
|
const { data: serviceData, error: serviceError } = await serviceClient
|
|
.from('users')
|
|
.select('*')
|
|
.limit(1);
|
|
|
|
if (serviceError) {
|
|
console.log(`❌ Service client error: ${serviceError.message}`);
|
|
} else {
|
|
console.log(`✅ Service client working! Found ${serviceData?.length || 0} users`);
|
|
}
|
|
|
|
// Test if documents table exists
|
|
console.log('\n🔍 Testing documents table...');
|
|
const { data: docsData, error: docsError } = await serviceClient
|
|
.from('documents')
|
|
.select('*')
|
|
.limit(1);
|
|
|
|
if (docsError) {
|
|
console.log(`❌ Documents table error: ${docsError.message}`);
|
|
if (docsError.message.includes('relation "documents" does not exist')) {
|
|
console.log('📋 Documents table does not exist - this is the issue!');
|
|
}
|
|
} else {
|
|
console.log(`✅ Documents table exists! Found ${docsData?.length || 0} documents`);
|
|
}
|
|
|
|
// List all tables
|
|
console.log('\n🔍 Listing all tables...');
|
|
const { data: tablesData, error: tablesError } = await serviceClient
|
|
.rpc('get_tables');
|
|
|
|
if (tablesError) {
|
|
console.log(`❌ Could not list tables: ${tablesError.message}`);
|
|
|
|
// Try a different approach to list tables
|
|
const { data: schemaData, error: schemaError } = await serviceClient
|
|
.from('information_schema.tables')
|
|
.select('table_name')
|
|
.eq('table_schema', 'public');
|
|
|
|
if (schemaError) {
|
|
console.log(`❌ Could not query schema: ${schemaError.message}`);
|
|
} else {
|
|
console.log(`✅ Found tables: ${schemaData?.map(t => t.table_name).join(', ') || 'none'}`);
|
|
}
|
|
} else {
|
|
console.log(`✅ Tables: ${tablesData?.join(', ') || 'none'}`);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ Supabase client test failed:', error.message);
|
|
console.error('Error details:', error);
|
|
}
|
|
}
|
|
|
|
testSupabaseClient();
|