-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
116 lines (109 loc) · 3.81 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import { Database } from "bun:sqlite";
const express = require("express");
const fs = require("fs");
const log = require("pino")();
require("dotenv").config();
const app = express();
log.info("Starting Project of the Day");
if (!fs.existsSync("sqlite3.db")) {
log.warn("Database not found, creating a new one");
fs.writeFileSync("sqlite3.db", "");
const db = new Database("sqlite3.db");
db.prepare(fs.readFileSync("setup.sql").toString()).run();
log.info("Database created");
}
const db = new Database("sqlite3.db");
log.info("Database loaded");
var currentPrompt = "Build a quiz app"; //TODO: Add a way to change and queue this
app.use((req, res, next) => {
log.info(`${req.method} ${req.url}`);
next();
});
app.post("/submit", async (req, res) => {
if (!req.headers.cookie?.includes("token=")) {
log.info("No token found");
return res.sendStatus(403).end(JSON.stringify({ error: "No token found" }));
}
const token = req.headers.cookie.split("token=")[1];
const user = await fetch(`https://api.github.com/user`, {
headers: { Authorization: `Bearer ${token}` },
}).then((res) => res.json());
if (!user) {
log.info("Invalid token");
return res.sendStatus(403).end(JSON.stringify({ error: "Invalid token" }));
}console.log("asdf")
if(!req.query.repo) {
log.info("No repo found");
return res.sendStatus(400).end(JSON.stringify({ error: "No repo found" }));
}
const repo = await fetch(`https://api.github.com/repos/${req.query.repo}`, {
headers: { Authorization: `Bearer ${token}` },
}).then((res) => res.json());
if (!repo || repo.owner.login != user.login) {
log.info("Invalid repo");
return res.sendStatus(403).end(JSON.stringify({ error: "Invalid repo" }));
}
try {
db.prepare(
"INSERT INTO submission (name, date, approved) VALUES (?, ?, ?)",
[repo.full_name, new Date().toUTCString(), true]
).run();
log.info("Submission added: " + repo.full_name);
return res.sendStatus(200).end(JSON.stringify({ message: "Submission added" }));
} catch(err) {
console.log(err)
return res.sendStatus(500).end(JSON.stringify({ error: err }));
}
});
app.get("/submit", (req, res, next) => {
if (!req.query.code && !req.headers.cookie?.includes("token="))
return res.redirect("/");
next();
});
app.use(express.static("public"));
app.get("/login", (req, res) => {
if (!req.headers.cookie?.includes("token="))
res.redirect(
`https://github.com/login/oauth/authorize?client_id=${process.env["CLIENT_ID"]}&scope=public_repo,read:user&redirect_uri=http://localhost:8080/submit`
);
else res.redirect("/submit");
});
app.get("/prompt", (req, res) => res.end(currentPrompt));
app.get("/showcase", (req, res) => {
const showcase = db
.prepare("SELECT name FROM submission WHERE approved = true")
.all()
.map((row) => {
return {
author: row.name,
github: `https://github.com/${row.name}`,
};
});
res.json(
showcase.sort(function (a, b) {
if (a.author < b.author) {
return -1;
}
if (a.author > b.author) {
return 1;
}
return 0;
})
);
res.end();
});
app.get("/genToken", (req, res) => {
fetch(
`https://github.com/login/oauth/access_token?client_id=${process.env["CLIENT_ID"]}&client_secret=${process.env["CLIENT_SECRET"]}&code=${req.query.code}`,
{ method: "POST", headers: { Accept: "application/json" } }
)
.then((res) => res.json())
.then((json) => res.end(json.access_token))
.catch((err) => {
console.error(err);
res.end();
});
});
app.listen(process.env["PORT"], () =>
log.info(`Available at http://localhost:${process.env["PORT"]}`)
);