update(project): finish up + ready for prod

This commit is contained in:
Saahil dutta 2024-10-12 23:30:33 -04:00
parent 4df82e3d81
commit 70d44be463
Signed by: neon
GPG key ID: 8A8B64515254CFC6
4 changed files with 58 additions and 10 deletions

View file

@ -4,12 +4,12 @@
- - [x] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth)
- - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B)
- - - [x] Add ping for new-song event & send message ovs
- [ ] Spotify
- [x] Spotify
- - [x] web api [docs](https://developer.spotify.com/documentation/web-api/)
- - [x] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/)
- - [x] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token)
- - [x] playlist tools (creation,modifcation,deletion)
- [x] keydb (quick db or smthing)
- [x] express
- [ ] transparency of added songs
- - [ ] export db -> into csv with properties (slack_id, url, added_at)
- [x] transparency of added songs
- - [x] export db -> into csv with properties (slack_id, url, added_at)

View file

@ -17,6 +17,17 @@ const { QuickDB } = require("quick.db");
const db = new QuickDB({
filePath: "./data/songs.sqlite",
});
function arrayToCsv(data){
return data.map(row =>
row
.map(String) // convert every value to String
.map(v => v.replaceAll('"', '""')) // escape double quotes
.map(v => `"${v}"`) // quote it
.join(',') // comma-separated
).join('\r\n'); // rows starting on new lines
}
let cacheDb = {};
const app = express();
const userScopes = ["identity.avatar", "identity.basic", "identity.team"];
@ -69,7 +80,7 @@ app.use(
path: path.join(__dirname, "../data/sessions"),
}),
saveUninitialized: true,
cookie: { secure: "auto", maxAge: 1000 * 60 * 60 * 24 * 365 },
cookie: { secure: "auto", maxAge: 1000 * 60 * 60 * 24 * 7 },
}),
);
@ -157,6 +168,18 @@ app.get("/home", async (req, res) => {
s: req.query.s,
});
});
app.get('/download/db', async (req,res) => {
if(!req.session.info) return res.redirect("/login")
const allSongs = await db.all();
const csvData = arrayToCsv([["slack_id", "url","song_id", "added_at"],
...allSongs.map(d => {
return [d.value.added_by, d.value.song_url, d.id, d.value.added_at]
})
])
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename="songs.csv"');
res.send(csvData);
})
app.post("/spotify/submitsong", async (req, res) => {
if (!req.session.token) return res.redirect("/login");
if (!cacheDb[req.query.token]) return res.redirect(`/home?error=0`);
@ -230,3 +253,10 @@ app.listen(process.env.PORT || 3000, async () => {
// if(!await db.has())
if (getCredentials() !== null) refreshToken(getCredentials().refresh_token);
});
process.on('uncaughtException', function(err) {
console.log(err);
});
process.on('unhandledRejection', function(err) {
console.log(err);
});

View file

@ -633,3 +633,12 @@ td {
max-width: var(--size-narrow-plus);
}
}
/* custom additions */
.error {
color: var(--red);
font-weight: bold;
}
.success {
color: var(--green);
font-weight: bold;
}

View file

@ -23,18 +23,21 @@
<div class="card container" style="max-width: 550px;">
<h2 class="headline">Submit Song</h2>
<!-- <p> -->
<form action="/spotify/submitsong?token=<%=onetimetoken%>" method="POST">
<form action="/spotify/submitsong?token=<%=onetimetoken%>" method="POST" disabled="<%=s%>">
<div class="interactive">
<label>Song URL</label>
<input type="url" name="songurl" placeholder="https://open.spotify.com/track/6aWOvqmjb3343D5sq7zMgl?si=b72b81a97e564dc3" />
<input type="url" name="songurl" disabled="<%=s%>" placeholder="https://open.spotify.com/track/6aWOvqmjb3343D5sq7zMgl?si=b72b81a97e564dc3" />
<br>
</div>
<!-- </p> -->
<% if (s) { %>
<!-- <meta property="hhtp-equiv" content="refresh"> -->
<meta http-equiv="refresh" content="5; url='/home'" />
<div class="success">
<h2>Success!</h2>
<p>Your song has been added to the playlist!</p>
<p class="success">Your song has been added to the playlist!</p>
<p>refreshing page in 5s</p>
<br>
</div>
<% } %>
@ -46,16 +49,22 @@
<% } %>
<br>
<button type="submit">Submit</button>
<button type="submit" disabled="<%=s%>">Submit</button>
</form>
</div>
</form>
</p>
</div>
<footer>
<a href="/logout" class="button">Logout</a>
<footer style="display: inline-flex;padding-left: 2px;padding-right: 2px;">
<a href="/logout" class="button" style="padding-left: 2px;padding-right: 2px;">Logout</a>
<div>
<a href="/download/db" download class="button" style="margin-left: 8px;margin-right: 2px;">Download all song entries</a>
</div>
</footer>
<p style="max-width: 250px; inline-size: max-content; word-break: break-all;color: gray;"> The "Download all song entries" button includes all songs submited thru the form (even if removed from the playlist)</p>
</div>
</center>
</body>