You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.7 KiB

//#region IMPORTS
import express from 'express';
import axios from 'axios';
import cors from 'cors';
import dotenv from 'dotenv';
import admin from 'firebase-admin';
//#endregion
//#region CONFIGURATIONS
dotenv.config();
admin.initializeApp({
credential: admin.credential.cert({
projectId: process.env.FIREBASE_PROJECT_ID,
private_key: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'),
client_email: process.env.FIREBASE_CLIENT_EMAIL,
})
});
const db = admin.firestore();
const clientId = process.env.CLIENT_ID;
const clientSecret = process.env.CLIENT_SECRET;
const port = process.env.PORT;
const redirectUri = process.env.REDIRECT_URL;
const allowedDomain = [ process.env.ALLOWED_DOMAIN ];
//#endregion
//#region LOGS
function stepBeggining(step) {
const sptor = "=".repeat(5);
console.log(`\n${sptor} ${step} ${sptor}`);
}
//#endregion
//#region APP INIT
const app = express()
app.use(cors({ origin: allowedDomain }));
app.use(express.json());
app.listen(port, () => { console.log(`Big brother is listening on port ${port}`) })
//#endregion
//#region ACCESS TOKEN
app.get('/callback', async (req, res) => {
stepBeggining("Activation");
let data;
let accessToken;
let refreshToken;
const code = req.query.code;
try {
const authOptions = {
url: 'https://accounts.spotify.com/api/token', method: 'post', json: true,
data: {
code: code,
redirect_uri: redirectUri,
grant_type: 'authorization_code'
},
headers: {
'content-type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + (new Buffer.from(clientId + ':' + clientSecret).toString('base64'))
}
};
const response1 = await axios(authOptions);
accessToken = response1.data.access_token
refreshToken = response1.data.refresh_token
} catch (error) {
console.log(`Error getting Spotify token: ${error}`);
console.log(error.response.data);
res.status(500).send('Error');
}
try {
const response2 = await axios.get(`https://api.spotify.com/v1/me`, { headers: { 'Authorization': 'Bearer ' + accessToken, } });
data = {
SpotifyId: response2.data.id,
AccessToken: accessToken,
RefreshToken: refreshToken
};
} catch (error) {
console.log(`Error getting user Spotify id: ${error}`);
res.status(500).send('Error');
}
try {
await db.collection("users").doc(data.SpotifyId).set({
accessToken: data.AccessToken,
refreshToken: data.RefreshToken,
});
console.log('Data inserted/updated successfully');
res.status(200).send('Ok');
} catch (error) {
console.log(`Error accessing database: ${error}`);
res.status(500).send('Error');
}
});
//#endregion