Web2k / server /index.js
Shinhati2023's picture
Create server/index.js
2a582da verified
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}`));