-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
140 lines (125 loc) · 3.01 KB
/
server.js
File metadata and controls
140 lines (125 loc) · 3.01 KB
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
const express = require('express')
const app = express()
const cors = require('cors')
const shortid = require('shortid')
// SQLite
const fs = require('fs')
const dbFile = './db/.data/sqlite.db'
const dbExists = fs.existsSync(dbFile)
const sqlite3 = require('sqlite3').verbose()
const db = new sqlite3.Database(dbFile, err => {
if (err) {
console.error(err.message)
}
console.log('Connected to the exercise-tracker database')
})
const dropTables = `
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS exercises;
`
const createTables = `
CREATE TABLE users(
id INTEGER PRIMARY KEY,
username TEXT NOT NULL
);
`
const seedUsers = `
INSERT INTO
users (username)
VALUES
('example1'),
('example2'),
('example3'),
('example4'),
('example5');
`
/*
CREATE TABLE exercises(
id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
title TEXT NOT NULL,
duration INT NOT NULL,
created_at DATE DEFAULT date('now'),
FOREIGN KEY (username) REFERENCES users(username)
)
INSERT INTO
exercises(username, title, duration, created_at)
VALUES
('example1', 'Bench Press', 3, '2019-12-01'),
('example2', 'Overhead Press', 5, '2019-12-11'),
('example3', 'Barbell Squat', 7)
*/
app.use(cors())
app.use(express.urlencoded({extended: false}))
app.use(express.json())
app.use(express.static('public'))
app.get('/', (req, res) => {
res.sendFile(__dirname + '/views/index.html')
})
db.serialize(() => {
if (!dbExists) {
db.run(dropTables)
console.log('Drop tables')
db.run(createTables)
console.log('Tables created!')
db.run(seedUsers)
console.log('Seed users!')
} else {
console.log('Database ready to go!')
}
})
// GET all users
app.get('/api/exercise/users', (req, res) => {
db.serialize(() => {
db.all('SELECT * FROM users', (err, rows) => {
if (rows) {
res.send(rows)
}
})
})
})
// POST new user
app.post('/api/exercise/new-user', (req, res) => {
db('users').insert({
username: req.body.username,
id: shortid.generate()
}).then(() => {
db('users').where('username', req.body.username)
.then(user => {
res.send(user)
})
})
})
// Not found middleware
app.use((req, res, next) => {
return next({status: 404, message: 'not found'})
})
// Error Handling middleware
app.use((err, req, res, next) => {
let errCode, errMessage
if (err.errors) {
// mongoose validation error
errCode = 400 // bad request
const keys = Object.keys(err.errors)
// report the first validation error
errMessage = err.errors[keys[0]].message
} else {
// generic or custom error
errCode = err.status || 500
errMessage = err.message || 'Internal Server Error'
}
res.status(errCode).type('txt')
.send(errMessage)
})
/*
// Close db connection
db.close(err => {
if (err) {
console.error(err.message);
}
console.log('Close the database connection');
})
*/
const listener = app.listen(process.env.PORT || 3000, () => {
console.log('Your app is listening on port ' + listener.address().port)
})