Add backend
With jwt authentication.
- POST /toktok {password} -> {token}
- GET /bandz -> {bandz}
- POST /wrap -> {id}
			
			
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | node_modules/ | ||||||
|  | .*.swp | ||||||
|  | yarn-error.log | ||||||
|  | data/*.db | ||||||
							
								
								
									
										27
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | chikinz | ||||||
|  | ======= | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | yarn install | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Launch: | ||||||
|  | ``` | ||||||
|  | node index | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Service then available at [http://localhost:3000] | ||||||
|  |  | ||||||
|  | Get a token: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | curl -H 'Content-Type: application/json' -d '{"password": "..."}' http://localhost:3000/toktok | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Use the token: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | curl -H 'Content-Type: application/json' -H 'Authorization: Bearer <<token here>>' -d '{data}' http://localhost:3000/wrap | ||||||
|  | ``` | ||||||
							
								
								
									
										0
									
								
								data/db_here
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								data/db_here
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										149
									
								
								index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | |||||||
|  | const bodyParser = require('body-parser'); | ||||||
|  | const express = require('express'); | ||||||
|  | require('express-async-errors'); | ||||||
|  | const jwt = require('jsonwebtoken'); | ||||||
|  | const path = require('path'); | ||||||
|  | const sqlite3 = require('sqlite3').verbose(); | ||||||
|  |  | ||||||
|  | const accessTokenSecret = 'cecinestpasunecledauthentificationjwt'; | ||||||
|  |  | ||||||
|  | const db_name = path.join(__dirname, "data", "chikinz.db"); | ||||||
|  | const db = new sqlite3.Database(db_name, err => { | ||||||
|  |     if (err) { | ||||||
|  |         return console.error(err.message); | ||||||
|  |     } | ||||||
|  |     console.log('Connected to the database.'); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | function makeTable(table) { | ||||||
|  |     db.run(table, err => { | ||||||
|  |         if (err) { | ||||||
|  |             throw err; | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | makeTable(` | ||||||
|  | CREATE TABLE IF NOT EXISTS Chikinz ( | ||||||
|  |   id INTEGER PRIMARY KEY AUTOINCREMENT, | ||||||
|  |   bandId INTEGER NOT NULL, | ||||||
|  |   weight REAL NOT NULL, | ||||||
|  |   killedDate DATE, | ||||||
|  |   wrappedDate DATE NOT NULL, | ||||||
|  |   soldDate DATE, | ||||||
|  |   misc TEXT | ||||||
|  | );`); | ||||||
|  |  | ||||||
|  | makeTable(` | ||||||
|  | CREATE TABLE IF NOT EXISTS Bandz ( | ||||||
|  |   id INTEGER PRIMARY KEY AUTOINCREMENT, | ||||||
|  |   name TEXT, | ||||||
|  |   receivedDate DATE, | ||||||
|  |   misc TEXT | ||||||
|  | );`); | ||||||
|  |  | ||||||
|  | const app = express(); | ||||||
|  |  | ||||||
|  | function addChikin(db, chikin) { | ||||||
|  |     const sql_insert = 'INSERT INTO Chikinz (bandId, weight, killedDate, wrappedDate) VALUES (?, ?, ?, ?);'; | ||||||
|  |     const {bandId, weight, killedDate, wrappedDate} = chikin; | ||||||
|  |     return new Promise((resolve, reject) => { | ||||||
|  |         db.run(sql_insert, [bandId, weight, killedDate, wrappedDate], function(err) { | ||||||
|  |             if (err) { | ||||||
|  |                 return reject(err); | ||||||
|  |             } | ||||||
|  |             resolve(this); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function getBandz(db) { | ||||||
|  |     return new Promise((resolve, reject) => { | ||||||
|  |         const bandz = []; | ||||||
|  |         db.each('SELECT id, name from Bandz', (err, row) => { | ||||||
|  |             if (err) { | ||||||
|  |                 return reject(err); | ||||||
|  |             } | ||||||
|  |             bandz.push(row); | ||||||
|  |         }, (err, rows) => { | ||||||
|  |             if (bandz.length !== rows) { | ||||||
|  |                 return reject('did not store all rows'); | ||||||
|  |             } | ||||||
|  |             resolve(bandz); | ||||||
|  |         });  | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const authenticateJWT = (req, res, next) => { | ||||||
|  |     const authHeader = req.headers.authorization; | ||||||
|  |  | ||||||
|  |     if (authHeader) { | ||||||
|  |         const token = authHeader.split(' ')[1]; | ||||||
|  |  | ||||||
|  |         jwt.verify(token, accessTokenSecret, (err, payload) => { | ||||||
|  |             if (err) { | ||||||
|  |                 console.log(err); | ||||||
|  |                 return res.sendStatus(403); | ||||||
|  |             } | ||||||
|  |             if (new Date().getTime() > payload.expiration) { | ||||||
|  |                 console.log('expired token'); | ||||||
|  |                 return res.sendStatus(403); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             req.auth = payload; | ||||||
|  |             next(); | ||||||
|  |         }); | ||||||
|  |     } else { | ||||||
|  |         res.sendStatus(401); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | app.use(bodyParser.json()); | ||||||
|  |  | ||||||
|  | app.listen(3000, () => { | ||||||
|  |     console.log('Server started (http://localhost:3000/)!'); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // all access points below | ||||||
|  |  | ||||||
|  | app.get("/", (req, res) => { | ||||||
|  |     res.send("This is not the way."); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | app.get('/bandz', authenticateJWT, async (req, res) => { | ||||||
|  |     const bandz = await getBandz(db); | ||||||
|  |     res.json({message: 'This is the way.', bandz}); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | app.post('/toktok', (req, res) => { | ||||||
|  |     const {password} = req.body; | ||||||
|  |     console.log(req.body); | ||||||
|  |  | ||||||
|  |     if (password != 'goldchocoboisbestchocobo.goldchocoboisonlychocobo') { | ||||||
|  |         return res.json({message: 'This is not the way.'}); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const expiration = new Date().getTime() + 7200000; | ||||||
|  |     const token = jwt.sign({expiration}, accessTokenSecret); | ||||||
|  |  | ||||||
|  |     res.json({message: 'This is the way.', token}); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | app.post('/wrap', authenticateJWT, async (req, res) => { | ||||||
|  |     const chikin = req.body; | ||||||
|  |     console.log(chikin); | ||||||
|  |     const {lastID} = await addChikin(db, chikin); | ||||||
|  |     res.json({message: 'This is the way.', id: lastID}); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // catch errors | ||||||
|  |  | ||||||
|  | app.use((err, req, res, next) => { | ||||||
|  |     console.error(err); | ||||||
|  |     res.status(500).json({ | ||||||
|  |         message: 'This is not the way.', | ||||||
|  |         error: err.message, | ||||||
|  |     }); | ||||||
|  | }); | ||||||
							
								
								
									
										17
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | { | ||||||
|  |   "name": "chikinz", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "a backend for ze chikinz", | ||||||
|  |   "main": "index.js", | ||||||
|  |   "author": "Paul Mathieu <paul@ponteilla.net>", | ||||||
|  |   "license": "MIT", | ||||||
|  |   "dependencies": { | ||||||
|  |     "express": "^4.18.1", | ||||||
|  |     "express-async-errors": "^3.1.1", | ||||||
|  |     "jsonwebtoken": "^8.5.1", | ||||||
|  |     "sqlite3": "^5.0.11" | ||||||
|  |   }, | ||||||
|  |   "devDependencies": { | ||||||
|  |     "nodemon": "^2.0.19" | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user