File size: 2,497 Bytes
590d81d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
```javascript
const { OAuth2Client } = require('google-auth-library');
const express = require('express');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config();

const app = express();
const client = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);

// Middleware
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: false,
  cookie: { secure: process.env.NODE_ENV === 'production', maxAge: 24 * 60 * 60 * 1000 }
}));

// Google OAuth routes
app.get('/auth/google', (req, res) => {
  const url = client.generateAuthUrl({
    access_type: 'online',
    scope: ['profile', 'email'],
    redirect_uri: process.env.GOOGLE_REDIRECT_URI
  });
  res.redirect(url);
});

app.get('/auth/google/callback', async (req, res) => {
  const { code } = req.query;

  try {
    const { tokens } = await client.getToken({
      code,
      redirect_uri: process.env.GOOGLE_REDIRECT_URI
    });

    const ticket = await client.verifyIdToken({
      idToken: tokens.id_token,
      audience: process.env.GOOGLE_CLIENT_ID
    });

    const payload = ticket.getPayload();
    req.session.user = {
      id: payload.sub,
      email: payload.email,
      name: payload.name,
      picture: payload.picture
    };

    res.redirect('/');
  } catch (error) {
    console.error('Auth error:', error);
    res.redirect('/?auth_error=1');
  }
});

app.get('/auth/logout', (req, res) => {
  req.session.destroy();
  res.redirect('/');
});

app.get('/auth/status', (req, res) => {
  res.json({ isAuthenticated: !!req.session.user, user: req.session.user });
});

// Chat history routes
app.get('/api/chats', async (req, res) => {
  if (!req.session.user) return res.sendStatus(401);
  
  // In a real app, you'd fetch from a database
  const chats = JSON.parse(localStorage.getItem(`chats_${req.session.user.id}`) || '[]');
  res.json(chats);
});

app.post('/api/chats', async (req, res) => {
  if (!req.session.user) return res.sendStatus(401);
  
  // In a real app, you'd save to a database
  const chats = JSON.parse(localStorage.getItem(`chats_${req.session.user.id}`) || '[]');
  chats.push(req.body);
  localStorage.setItem(`chats_${req.session.user.id}`, JSON.stringify(chats));
  
  res.sendStatus(201);
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
```