const path = require('path'); //const ping = require('heroku-self-ping').default(`${process.env.HEROKU_URL}/ping`); const express = require('express'); const packageInfo = require('./package.json'); var app = express(); app.use(express.static(path.join(__dirname, 'public'))); app.set('view engine', 'ejs'); var server = app.listen(process.env.PORT, function () { console.log(`Обработка страниц в браузере запущена. Порт ${process.env.PORT}`); setTimeout(ping, 1000); }); app.get('/', function (req, res) { res.json({ version: packageInfo.version }); }); /******************--- saveNewUsers ----**************************/ const { Client } = require('pg'); const client = new Client({ connectionString: process.env.DATABASE_URL, ssl: { rejectUnauthorized: false } }) client.connect(); var queue = new Map(); saveNewUsers(); function saveNewUsers(){ (async () => { var user = queue.entries().next().value; while (user){ var add_user = `INSERT INTO USERS(ID, REFRESH_TOKEN) VALUES(${user[0]}, '${user[1]}') ON CONFLICT (ID) DO UPDATE SET REFRESH_TOKEN = EXCLUDED.REFRESH_TOKEN;`; await client.query(add_user); queue.delete(user[0]); user = queue.entries().next().value; } setTimeout(saveNewUsers, 1000); })() .catch(e => { console.error(e); }); } /******************--- saveNewUsers ----**************************/ /******************--- callback ----**************************/ var SpotifyWebApi = require('spotify-web-api-node'); var spotifyClientId = process.env.SPOTIFY_CLIENT_ID; var spotifyClientSecret = process.env.SPOTIFY_CLIENT_SECRET; var spotifyRedirectUri = process.env.SPOTIFY_REDIRECT_URI; app.get('/callback', (req, res) => { const error = req.query.error; const code = req.query.code; const state = req.query.state; if (error) { console.error('Ошибка на странице авторизации:', error); res.send(`Ошибка авторизации`); return; } var temp_spotifyApi = new SpotifyWebApi({ clientId: spotifyClientId, clientSecret: spotifyClientSecret, redirectUri: spotifyRedirectUri }); var id = parseInt(state); temp_spotifyApi .authorizationCodeGrant(code) .then(data => { const refresh_token = data.body['refresh_token']; queue.set(id,refresh_token); console.log(`Прошла авторизация пользователя (id = ${id}, refreshToken = '${refresh_token}')`); res.redirect('/auth_completed'); }) .catch(error => { console.error('Error getting Tokens:', error); res.send(`Ошибка авторизации: ${error}`); }) }); app.get('/callback_admin', (req, res) => { const error = req.query.error; const code = req.query.code; const state = req.query.state; if (error) { console.error('Ошибка на странице авторизации:', error); res.send(`Ошибка авторизации`); return; } var options = JSON.parse(decodeURI(state)); var temp_spotifyApi = new SpotifyWebApi(options); temp_spotifyApi .authorizationCodeGrant(code) .then(data => { const refresh_token = data.body['refresh_token']; console.log(`Прошла авторизация пользователя (refreshToken = '${refresh_token}')`); res.send(refresh_token); }) .catch(error => { console.error('Error getting Tokens:', error); res.send(`Ошибка авторизации: ${error}`); }) }); /******************--- callback ----**************************/ /******************--- auth_completed ----**************************/ app.get('/auth_completed', (req, res) => { res.render('pages/auth_completed'); }); /******************--- auth_completed ----**************************/ /******************--- Pinging ----**************************/ app.get('/ping', function(req, res, next) { res.status(200).send("pong"); }); const https = require('https') const options = { hostname: 'myspotifytransfer.herokuapp.com', path: '/ping', method: 'GET' } function ping(){ const req = https.request(options, res => { console.log(`Server ping - statusCode: ${res.statusCode}`) }).end() setTimeout(ping, 1200000); } /******************--- Pinging ----**************************/