require('dotenv').config(); const express = require('express'); const path = require('path'); const cors = require('cors'); const { createClient } = require('@supabase/supabase-js'); const { google } = require('googleapis'); const multer = require('multer'); const stream = require('stream'); const app = express(); const PORT = process.env.PORT || 7860; const upload = multer({ storage: multer.memoryStorage() }); app.use(cors()); app.use(express.json()); app.use(express.static(path.join(__dirname, '../public'))); const supabase = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_KEY ); const oauth2Client = new google.auth.OAuth2( process.env.GOOGLE_CLIENT_ID, process.env.GOOGLE_CLIENT_SECRET, process.env.GOOGLE_REDIRECT_URI ); // 1. Connect Drive app.get('/api/drive/connect', (req, res) => { const { user_id } = req.query; const url = oauth2Client.generateAuthUrl({ access_type: 'offline', scope: ['https://www.googleapis.com/auth/drive.file'], state: user_id, prompt: 'consent' }); res.redirect(url); }); // 2. Callback app.get('/api/drive/callback', async (req, res) => { const { code, state: user_id } = req.query; try { const { tokens } = await oauth2Client.getToken(code); oauth2Client.setCredentials(tokens); const drive = google.drive({ version: 'v3', auth: oauth2Client }); const folder = await drive.files.create({ resource: { name: 'AI Generations (App)', mimeType: 'application/vnd.google-apps.folder' }, fields: 'id' }); await supabase.from('drive_accounts').upsert({ user_id: user_id, folder_id: folder.data.id, refresh_token: tokens.refresh_token }); res.redirect('/?drive_success=true'); } catch (error) { console.error(error); res.redirect('/?drive_error=true'); } }); // 3. Upload app.post('/api/drive/upload', upload.single('image'), async (req, res) => { const token = req.headers.authorization?.split(' ')[1]; const { data: { user } } = await supabase.auth.getUser(token); if (!user) return res.status(401).json({ error: 'Unauthorized' }); const { data: driveData } = await supabase .from('drive_accounts').select('*').eq('user_id', user.id).single(); if (!driveData) return res.status(400).json({ error: 'Drive not connected' }); oauth2Client.setCredentials({ refresh_token: driveData.refresh_token }); const drive = google.drive({ version: 'v3', auth: oauth2Client }); const bufferStream = new stream.PassThrough(); bufferStream.end(req.file.buffer); const file = await drive.files.create({ resource: { name: `gen_${Date.now()}.png`, parents: [driveData.folder_id] }, media: { mimeType: 'image/png', body: bufferStream }, fields: 'id, webViewLink' }); await supabase.from('generations').insert({ user_id: user.id, prompt: req.body.prompt, drive_file_id: file.data.id, drive_view_link: file.data.webViewLink }); res.json({ success: true, link: file.data.webViewLink }); }); app.get('*', (req, res) => res.sendFile(path.join(__dirname, '../public/index.html'))); app.listen(PORT, '0.0.0.0', () => console.log(`Running on ${PORT}`));