lfqian commited on
Commit
80cac11
·
1 Parent(s): a76972e

feat: use Supabase JSONB column for asset requests storage

Browse files

- Add SQL query to create asset_requests_data JSONB column
- Store all asset requests in InvestorAgent/2025-08-01/BTC row
- Update AddAssetView to read/write from Supabase
- Update AssetRequestsView to display and vote via Supabase
- All users can now see and vote on shared asset requests

src/views/AddAssetView.vue CHANGED
@@ -124,7 +124,7 @@ import Textarea from 'primevue/textarea'
124
  import Dropdown from 'primevue/dropdown'
125
  import Button from 'primevue/button'
126
  import Message from 'primevue/message'
127
- import emailjs from 'emailjs-com'
128
 
129
  export default {
130
  name: 'AddAssetsView',
@@ -219,12 +219,18 @@ export default {
219
  this.assetForm.message = ''
220
 
221
  try {
222
- // 读取现有数据
223
- const response = await fetch('/data/asset_requests.json')
224
- let requests = []
225
- if (response.ok) {
226
- requests = await response.json()
227
- }
 
 
 
 
 
 
228
 
229
  const assetRequest = {
230
  symbol: this.assetForm.symbol.toUpperCase(),
@@ -245,37 +251,15 @@ export default {
245
  requests.push(assetRequest)
246
  }
247
 
248
- // 使用 Hugging Face API 更新文件
249
- const token = import.meta.env.VITE_HF_TOKEN || ''
250
- if (!token) {
251
- console.warn('HF_TOKEN not configured, asset will not be saved')
252
- // 仍然跳转到结果页面
253
- await new Promise(resolve => setTimeout(resolve, 500))
254
- this.$router.push('/asset-requests')
255
- return
256
- }
257
 
258
- const uploadResponse = await fetch(
259
- 'https://huggingface.co/api/spaces/TheFinAI/Agent-Market-Arena/upload/main',
260
- {
261
- method: 'POST',
262
- headers: {
263
- 'Authorization': `Bearer ${token}`,
264
- 'Content-Type': 'application/json',
265
- },
266
- body: JSON.stringify({
267
- files: [{
268
- path: 'public/data/asset_requests.json',
269
- content: JSON.stringify(requests, null, 2)
270
- }],
271
- summary: `Add asset request: ${assetRequest.symbol}`
272
- })
273
- }
274
- )
275
-
276
- if (!uploadResponse.ok) {
277
- throw new Error('Failed to update file')
278
- }
279
 
280
  // 延迟跳转,让用户看到动画
281
  await new Promise(resolve => setTimeout(resolve, 500))
 
124
  import Dropdown from 'primevue/dropdown'
125
  import Button from 'primevue/button'
126
  import Message from 'primevue/message'
127
+ import { supabase } from '../lib/supabase.js'
128
 
129
  export default {
130
  name: 'AddAssetsView',
 
219
  this.assetForm.message = ''
220
 
221
  try {
222
+ // 读取现有的 asset requests 数据
223
+ const { data: row, error: fetchError } = await supabase
224
+ .from('trading_decisions')
225
+ .select('asset_requests_data')
226
+ .eq('agent_name', 'InvestorAgent')
227
+ .eq('date', '2025-08-01')
228
+ .eq('asset', 'BTC')
229
+ .single()
230
+
231
+ if (fetchError) throw fetchError
232
+
233
+ let requests = row?.asset_requests_data || []
234
 
235
  const assetRequest = {
236
  symbol: this.assetForm.symbol.toUpperCase(),
 
251
  requests.push(assetRequest)
252
  }
253
 
254
+ // 保存回 Supabase
255
+ const { error: updateError } = await supabase
256
+ .from('trading_decisions')
257
+ .update({ asset_requests_data: requests })
258
+ .eq('agent_name', 'InvestorAgent')
259
+ .eq('date', '2025-08-01')
260
+ .eq('asset', 'BTC')
 
 
261
 
262
+ if (updateError) throw updateError
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263
 
264
  // 延迟跳转,让用户看到动画
265
  await new Promise(resolve => setTimeout(resolve, 500))
src/views/AssetRequestsView.vue CHANGED
@@ -80,6 +80,7 @@
80
  import Card from 'primevue/card'
81
  import Button from 'primevue/button'
82
  import ProgressSpinner from 'primevue/progressspinner'
 
83
 
84
  export default {
85
  name: 'AssetRequestsView',
@@ -103,14 +104,24 @@ export default {
103
  async loadRequests() {
104
  this.loading = true
105
  try {
106
- const response = await fetch('/data/asset_requests.json')
107
- if (response.ok) {
108
- const requests = await response.json()
109
- // 按投票数排序,取前10个
110
- this.topRequests = requests
111
- .sort((a, b) => b.votes - a.votes)
112
- .slice(0, 10)
 
 
 
 
113
  }
 
 
 
 
 
 
114
  } catch (e) {
115
  console.error('Error loading requests:', e)
116
  } finally {
@@ -132,49 +143,39 @@ export default {
132
  async voteForAsset(symbol) {
133
  try {
134
  // 读取现有数据
135
- const response = await fetch('/data/asset_requests.json')
136
- if (!response.ok) return
 
 
 
 
 
137
 
138
- const requests = await response.json()
 
 
139
  const index = requests.findIndex(r => r.symbol === symbol)
140
 
141
  if (index >= 0) {
142
  requests[index].votes += 1
143
  requests[index].timestamp = new Date().toISOString()
144
 
145
- // 使用 Hugging Face API 更新文件
146
- const token = import.meta.env.VITE_HF_TOKEN || ''
147
- if (!token) {
148
- console.warn('HF_TOKEN not configured')
149
- return
150
- }
 
 
 
151
 
152
- const uploadResponse = await fetch(
153
- 'https://huggingface.co/api/spaces/TheFinAI/Agent-Market-Arena/upload/main',
154
- {
155
- method: 'POST',
156
- headers: {
157
- 'Authorization': `Bearer ${token}`,
158
- 'Content-Type': 'application/json',
159
- },
160
- body: JSON.stringify({
161
- files: [{
162
- path: 'public/data/asset_requests.json',
163
- content: JSON.stringify(requests, null, 2)
164
- }],
165
- summary: `Vote for asset: ${symbol}`
166
- })
167
- }
168
- )
169
 
170
- if (uploadResponse.ok) {
171
- // 记录投票
172
- this.votedAssets.add(symbol)
173
- localStorage.setItem('votedAssets', JSON.stringify([...this.votedAssets]))
174
-
175
- // 重新加载
176
- await this.loadRequests()
177
- }
178
  }
179
  } catch (e) {
180
  console.error('Error voting:', e)
 
80
  import Card from 'primevue/card'
81
  import Button from 'primevue/button'
82
  import ProgressSpinner from 'primevue/progressspinner'
83
+ import { supabase } from '../lib/supabase.js'
84
 
85
  export default {
86
  name: 'AssetRequestsView',
 
104
  async loadRequests() {
105
  this.loading = true
106
  try {
107
+ const { data: row, error } = await supabase
108
+ .from('trading_decisions')
109
+ .select('asset_requests_data')
110
+ .eq('agent_name', 'InvestorAgent')
111
+ .eq('date', '2025-08-01')
112
+ .eq('asset', 'BTC')
113
+ .single()
114
+
115
+ if (error) {
116
+ console.error('Error loading requests:', error)
117
+ return
118
  }
119
+
120
+ const requests = row?.asset_requests_data || []
121
+ // 按投票数排序,取前10个
122
+ this.topRequests = requests
123
+ .sort((a, b) => b.votes - a.votes)
124
+ .slice(0, 10)
125
  } catch (e) {
126
  console.error('Error loading requests:', e)
127
  } finally {
 
143
  async voteForAsset(symbol) {
144
  try {
145
  // 读取现有数据
146
+ const { data: row, error: fetchError } = await supabase
147
+ .from('trading_decisions')
148
+ .select('asset_requests_data')
149
+ .eq('agent_name', 'InvestorAgent')
150
+ .eq('date', '2025-08-01')
151
+ .eq('asset', 'BTC')
152
+ .single()
153
 
154
+ if (fetchError) throw fetchError
155
+
156
+ const requests = row?.asset_requests_data || []
157
  const index = requests.findIndex(r => r.symbol === symbol)
158
 
159
  if (index >= 0) {
160
  requests[index].votes += 1
161
  requests[index].timestamp = new Date().toISOString()
162
 
163
+ // 保存回 Supabase
164
+ const { error: updateError } = await supabase
165
+ .from('trading_decisions')
166
+ .update({ asset_requests_data: requests })
167
+ .eq('agent_name', 'InvestorAgent')
168
+ .eq('date', '2025-08-01')
169
+ .eq('asset', 'BTC')
170
+
171
+ if (updateError) throw updateError
172
 
173
+ // 记录投票
174
+ this.votedAssets.add(symbol)
175
+ localStorage.setItem('votedAssets', JSON.stringify([...this.votedAssets]))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
 
177
+ // 重新加载
178
+ await this.loadRequests()
 
 
 
 
 
 
179
  }
180
  } catch (e) {
181
  console.error('Error voting:', e)
supabase_queries.sql ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -- 1. 在 trading_decisions 表添加 JSON 列存储 asset requests
2
+ ALTER TABLE trading_decisions
3
+ ADD COLUMN asset_requests_data JSONB;
4
+
5
+ -- 2. 在特定行初始化 asset requests 数据
6
+ -- (InvestorAgent, 2025-08-01, BTC)
7
+ UPDATE trading_decisions
8
+ SET asset_requests_data = '[]'::jsonb
9
+ WHERE agent_name = 'InvestorAgent'
10
+ AND date = '2025-08-01'
11
+ AND asset = 'BTC';
12
+
13
+ -- 3. 创建索引以提高查询性能(可选)
14
+ CREATE INDEX IF NOT EXISTS idx_asset_requests_data
15
+ ON trading_decisions USING GIN (asset_requests_data);
16
+