Pepguy commited on
Commit
017e9c7
·
verified ·
1 Parent(s): e2b3a17

Update app.js

Browse files
Files changed (1) hide show
  1. app.js +39 -25
app.js CHANGED
@@ -1,7 +1,7 @@
1
  import express from 'express';
2
  import cors from 'cors';
3
  import dotenv from 'dotenv';
4
- import mongoose from 'mongoose';
5
  import { BedrockRuntimeClient, ConverseStreamCommand } from "@aws-sdk/client-bedrock-runtime";
6
  import { NodeHttpHandler } from "@smithy/node-http-handler";
7
  import path from 'path';
@@ -35,15 +35,11 @@ function getBedrockModelId(modelName) {
35
  }
36
  }
37
 
38
- // --- DB & MEMORY MANAGEMENT ---
39
- const ChatSchema = new mongoose.Schema({
40
- id: String,
41
- title: String,
42
- totalTokens: { type: Number, default: 0 },
43
- messages: Array, // Array of { role, content, reasoning }
44
- updatedAt: { type: Date, default: Date.now }
45
- });
46
- const Chat = mongoose.model('Chat', ChatSchema);
47
 
48
  let memoryChats = {};
49
  let dirtyChats = new Set(); // Track chats that need DB syncing
@@ -51,30 +47,47 @@ let dirtyChats = new Set(); // Track chats that need DB syncing
51
  // Hydrate from DB on startup
52
  async function initDB() {
53
  try {
54
- await mongoose.connect(process.env.MONGODB_URI);
55
- console.log('✅ Connected to MongoDB');
56
- const dbChats = await Chat.find();
57
- dbChats.forEach(c => {
58
- memoryChats[c.id] = { ...c.toObject(), isGenerating: false };
59
- });
60
- console.log(`✅ Hydrated ${dbChats.length} chats from DB.`);
 
 
 
61
 
62
  // Sync to DB every 15 seconds (occasional sync)
63
  setInterval(async () => {
64
  if (dirtyChats.size === 0) return;
65
  const toSync = Array.from(dirtyChats);
66
  dirtyChats.clear();
67
- for (const id of toSync) {
68
- if (memoryChats[id]) {
69
- memoryChats[id].updatedAt = new Date();
70
- await Chat.findOneAndUpdate({ id }, memoryChats[id], { upsert: true });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  }
72
  }
73
- console.log(`💾 Synced ${toSync.length} chats to MongoDB.`);
74
  }, 15000);
75
 
76
  } catch (err) {
77
- console.error('❌ MongoDB Connection Error:', err);
78
  }
79
  }
80
  initDB();
@@ -105,7 +118,7 @@ app.post('/api/chats', (req, res) => {
105
  totalTokens: 0,
106
  messages:[],
107
  isGenerating: false,
108
- updatedAt: new Date()
109
  };
110
  dirtyChats.add(newId);
111
  res.json(memoryChats[newId]);
@@ -116,7 +129,8 @@ app.delete('/api/chats/:id', async (req, res) => {
116
  const { id } = req.params;
117
  delete memoryChats[id];
118
  dirtyChats.delete(id);
119
- await Chat.deleteOne({ id });
 
120
  res.json({ success: true });
121
  });
122
 
 
1
  import express from 'express';
2
  import cors from 'cors';
3
  import dotenv from 'dotenv';
4
+ import { createClient } from '@supabase/supabase-js';
5
  import { BedrockRuntimeClient, ConverseStreamCommand } from "@aws-sdk/client-bedrock-runtime";
6
  import { NodeHttpHandler } from "@smithy/node-http-handler";
7
  import path from 'path';
 
35
  }
36
  }
37
 
38
+ // --- DB & MEMORY MANAGEMENT (SUPABASE) ---
39
+ const supabase = createClient(
40
+ process.env.SUPABASE_URL || '',
41
+ process.env.SUPABASE_KEY || ''
42
+ );
 
 
 
 
43
 
44
  let memoryChats = {};
45
  let dirtyChats = new Set(); // Track chats that need DB syncing
 
47
  // Hydrate from DB on startup
48
  async function initDB() {
49
  try {
50
+ const { data: dbChats, error } = await supabase.from('chats').select('*');
51
+ if (error) throw error;
52
+
53
+ console.log('✅ Connected to Supabase');
54
+ if (dbChats) {
55
+ dbChats.forEach(c => {
56
+ memoryChats[c.id] = { ...c, isGenerating: false };
57
+ });
58
+ console.log(`✅ Hydrated ${dbChats.length} chats from DB.`);
59
+ }
60
 
61
  // Sync to DB every 15 seconds (occasional sync)
62
  setInterval(async () => {
63
  if (dirtyChats.size === 0) return;
64
  const toSync = Array.from(dirtyChats);
65
  dirtyChats.clear();
66
+
67
+ const rowsToUpsert = toSync.map(id => {
68
+ const chat = memoryChats[id];
69
+ chat.updatedAt = new Date().toISOString();
70
+ return {
71
+ id: chat.id,
72
+ title: chat.title,
73
+ totalTokens: chat.totalTokens,
74
+ messages: chat.messages,
75
+ updatedAt: chat.updatedAt
76
+ };
77
+ });
78
+
79
+ if (rowsToUpsert.length > 0) {
80
+ const { error } = await supabase.from('chats').upsert(rowsToUpsert);
81
+ if (error) {
82
+ console.error('❌ Supabase Sync Error:', error);
83
+ } else {
84
+ console.log(`💾 Synced ${rowsToUpsert.length} chats to Supabase.`);
85
  }
86
  }
 
87
  }, 15000);
88
 
89
  } catch (err) {
90
+ console.error('❌ Supabase Initialization Error:', err);
91
  }
92
  }
93
  initDB();
 
118
  totalTokens: 0,
119
  messages:[],
120
  isGenerating: false,
121
+ updatedAt: new Date().toISOString()
122
  };
123
  dirtyChats.add(newId);
124
  res.json(memoryChats[newId]);
 
129
  const { id } = req.params;
130
  delete memoryChats[id];
131
  dirtyChats.delete(id);
132
+
133
+ await supabase.from('chats').delete().eq('id', id);
134
  res.json({ success: true });
135
  });
136