-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
107 lines (85 loc) · 3.96 KB
/
server.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
/* Notes:
-------- How to run "sapunareala" --------
1. Fill in /server/env.js accordingly with information such as the connection data to your desired PG database
2. Initialise the Database if needed by modifying the INITIALISING_DB flag to true
3. npm start
Note: Redis runs locally by default
-------- Why? --------
Why does the NodeJS Postgres driver require prepared parameters to have indexed variables?
ie: 'INSERT INTO users(name, email) VALUES($1, $2) RETURNING *'
We should simply be able to have $ or ? if we wanted so, instead of $1, $2, ..., $666013. It's silly like this.
Why does app.use() cancel the following app.post(...) routes? Weird.
-------- Documentation reading --------
ie: the little comments before every route
How to read the arrows:
<- means "gets", ie: the API requires these values
-> means "gives", ie: the API returns these values
Also, the auth & data objects are pretty self explanatory. Hopefully.
[v] means done
[ ] means not done
-------- Project architecture --------
[v] For one, I could put all routes in a separated /Routes folder. I've seen that before and it's a nice practice.
[v] Also, the project currently doesn't serve static/public files - that should be fixable easily with Express.
-------- To Do --------
[ ] HTTPS
[v] Create users & projects tables.
[v] Bluebird Promises. I don't understand why Bluebird over vanilla, but its site and documentation are terribly lacking after a brief inspection.
[v] Redis. Let's see what it's good for and how I'll glue it into the app.
[ ] React. Vue > React (just a personal preference here atm), but the site could use better reactivity than my freestyle javascript maneuvering.
*/
// Requires
let pg = require("pg")
let express = require("express")
let redis = require("redis")
let bodyParser = require("body-parser")
let bluebird = require("bluebird")
let http = require("http")
let https = require("https")
let fs = require("fs")
//bluebird.promisifyAll(redis)
// Custom Requires
let getRouter = require("./routes/index.js")
// Config
let env = require("./server/env.js")
const INITIALISING_DB = true;
// Main
async function main(){
let pg_client;
let redis_client;
try {
// Connect to DB
console.log("Connecting to PostGres...")
pg_client = new pg.Client(env.PG_CONNECT)
await pg_client.connect()
console.log("Connected to PG!")
console.log("Connecting to Redis...")
redis_client = bluebird.Promise.promisifyAll(redis.createClient()) // Here's where Bluebird does some magic and promisifies Redis...
console.log("Connected to Redis!")
// Initialise DB, if needed
if(INITIALISING_DB){
await require("./server/initialiseDatabase.js").reset_and_init_db(pg_client, redis_client)
}
// Express App
let app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(express.static("public"))
app.use(getRouter(pg_client, redis_client))
try{
let privateKey = fs.readFileSync("/etc/letsencrypt/live/fluffydogs.go.ro-0001/privkey.pem", "utf8")
let certificate = fs.readFileSync("/etc/letsencrypt/live/fluffydogs.go.ro-0001/cert.pem", "utf8")
let chain = fs.readFileSync("/etc/letsencrypt/live/fluffydogs.go.ro-0001/chain.pem", "utf8");
let httpsCredentials = {key: privateKey, cert: certificate, ca: chain}
let httpsServer = https.createServer(httpsCredentials, app);
httpsServer.listen(443);
console.log("HTTPS server listening on port 443!");
} catch(e) { console.log("Failed to run HTTPS server"); console.log(e); }
let httpServer = http.createServer(app);
httpServer.listen(80);
console.log("HTTP server listening on port 80!");
/*app.listen(env.WEB_PORT, () => {
console.log(`Running Express Server on port ${env.WEB_PORT}`)
})*/
} catch(e) { console.log(e)}
}
main()