fix(rates): серверный прокси /api/rates-proxy и бейдж «Курсы не загружены»

- Добавлен /api/rates-proxy для загрузки курсов без CORS
- Фронтенд загружает курсы через прокси, а не напрямую
- convertWithProviderRate возвращает source=no-rates при отсутствии ratesData
- ConvertedAmount показывает «Курсы не загружены» (жёлтый) вместо ложного «Глобальный курс»

Made-with: Cursor
This commit is contained in:
Denozordec
2026-03-23 21:45:02 +07:00
parent a97ec8c121
commit 92a986c858
5 changed files with 41 additions and 4 deletions
+2
View File
@@ -18,6 +18,7 @@ import settingsRouter from './routes/settings.js'
import syncRouter from './routes/sync.js'
import projectsRouter from './routes/projects.js'
import backupRouter from './routes/backup.js'
import ratesProxyRouter from './routes/rates-proxy.js'
const app = express()
const PORT = process.env.PORT || 3001
@@ -39,6 +40,7 @@ app.use(express.json({ limit: '50mb' }))
app.use('/api/sync', syncRouter)
app.use('/api/projects', projectsRouter)
app.use('/api/backup', backupRouter)
app.use('/api/rates-proxy', ratesProxyRouter)
if (existsSync(distPath)) {
app.use(express.static(distPath))
+22
View File
@@ -0,0 +1,22 @@
import { Router } from 'express'
const router = Router()
router.get('/', async (req, res) => {
const url = req.query.url
if (!url) {
return res.status(400).json({ error: 'Missing url parameter' })
}
try {
const response = await fetch(url, { signal: AbortSignal.timeout(10_000) })
if (!response.ok) {
return res.status(502).json({ error: `Upstream returned ${response.status}` })
}
const data = await response.json()
res.json(data)
} catch (err) {
res.status(502).json({ error: err.message || 'Failed to fetch rates' })
}
})
export default router