├── .DS_Store ├── readme.md └── server.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NickMoignard/node-firebase-restful/e0ebd0f3daa59e8f3ca5b21152b4cd1e47a90b41/.DS_Store -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | I wanted to build a RESTful API with Node.js the Express router and firebase so i built the following 2 | 3 | it is a simple RESTful api, which stores and returns users names and nick names 4 | 5 | API LIVE AT http://104.155.196.152:6969/api 6 | 7 | use x-www-formurlencoded parameters. 8 | 9 | Methods 10 | 11 | '/users': 12 | 13 | .GET: Returns all users 14 | 15 | .POST: Create a user 16 | 17 | parameters: 18 | 19 | fname: string 20 | 21 | lname: string 22 | 23 | nname: string 24 | 25 | '/users/:unique identifier' 26 | 27 | .GET: Return a user 28 | 29 | .PUT: Update a users information 30 | 31 | parameters: 32 | 33 | fname: string 34 | 35 | lname: string 36 | 37 | nname: string 38 | 39 | .DELETE: Delete a user 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | /* 2 | Structure of Document 3 | Setup 4 | Config 5 | BASE routes 6 | middleware 7 | routes 8 | API routes 9 | middleware 10 | routes 11 | 12 | Integrating Firebase into web app 13 | */ 14 | 15 | // BASE SETUP ================================================================ 16 | var express = require('express'), 17 | app = express(), 18 | bodyParser = require('body-parser'), 19 | morgan = require('morgan'), 20 | firebase = require("firebase"); 21 | 22 | var port = process.env.PORT || 6969; 23 | 24 | 25 | // firebase setup 26 | firebase.initializeApp({ 27 | databaseURL: "https://nodeandfirebasetest.firebaseio.com/", 28 | serviceAccount: "service_account.json" 29 | }); 30 | var db = firebase.database(); 31 | var usersRef = db.ref("users"); 32 | 33 | 34 | // CONFIGURE APP 35 | 36 | // body parser, to grab information from POST requests 37 | app.use(bodyParser.urlencoded({ extended: true })); 38 | app.use(bodyParser.json()); 39 | 40 | // configure app to handle CORS requests 41 | app.use(function(req, res, next) { 42 | res.setHeader('Access-Control-Allow-Origin', '*'); 43 | res.setHeader('Access-Control-Allow-Methods', 'GET, POSTS'); 44 | res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, \ 45 | content-type, Authorization'); 46 | next(); 47 | }); 48 | 49 | 50 | // BASE APP ================================================================== 51 | // MIDDLEWARE 52 | app.use(morgan('dev')); // log all requests to the console 53 | 54 | // BASE ROUTES 55 | app.get('/', function(req, res) { 56 | res.send('welcome to the home page!'); 57 | }); 58 | 59 | 60 | 61 | // API ======================================================================= 62 | var apiRouter = express.Router(); // get an express router 63 | 64 | // API MIDDLEWARE ============================================================ 65 | apiRouter.use(function(req, res, next) { 66 | console.log("someone just came to the app"); 67 | // this is where we authenticate users 68 | next(); 69 | }); 70 | 71 | // API Routes ================================================================= 72 | apiRouter.get('/', function(req, res) { 73 | res.json({ message: 'woah check out this json'}); 74 | }); 75 | 76 | apiRouter.route('/users') 77 | //create a user 78 | .post(function(req, res) { 79 | // Firebase 80 | var user = {}; 81 | user.firstName = req.body.fname; 82 | user.lastName =req.body.lname; 83 | user.nickName = req.body.nname; 84 | usersRef.push({ 85 | first_name: req.body.fname, 86 | last_name: req.body.lname, 87 | nick_name: req.body.nname 88 | }, function(err) { 89 | if (err) { 90 | res.send(err) 91 | } else { 92 | res.json({ message: "Success: User created."}) 93 | } 94 | }); 95 | 96 | }) 97 | .get(function(req, res) { 98 | // Firebase get all users 99 | usersRef.once("value", function(snapshot, prevChildKey) { 100 | res.json(snapshot.val()); 101 | }) 102 | }); 103 | 104 | // Single User Routes 105 | apiRouter.route('/users/:uid') 106 | 107 | .get(function(req, res) { 108 | // Firebase GET user info 109 | var uid = req.params.uid; 110 | // in firebase there is no way to access a single object 111 | // Use startAt(uid) then endAt(uid + a really high point value unicode character) 112 | // then ensure uid is 20 characters long other wise lots of children will be returned 113 | if (uid.length != 20) { 114 | res.json({message: "Error: uid must be 20 characters long."}); 115 | } else { 116 | usersRef.child(uid).once("value", function(snapshot) { 117 | if (snapshot.val() == null) { 118 | res.json({message: "Error: No user found with that uid"}); 119 | } else { 120 | res.json(snapshot.val()); 121 | } 122 | }); 123 | } 124 | }) 125 | .put(function(req, res) { 126 | // Firebase Update user info 127 | 128 | 129 | var uid = req.params.uid, 130 | user = {}; 131 | 132 | // update only parameters sent in request 133 | if (req.body.fname) user.first_name = req.body.fname; 134 | if (req.body.lname) user.last_name = req.body.lname; 135 | if (req.body.nname) user.nick_name = req.body.nname; 136 | 137 | usersRef.child(uid).update(user, function(err) { 138 | if (err) { 139 | res.send(err); 140 | } else { 141 | res.json({message: "Success: User information correctly updated."}) 142 | } 143 | }); 144 | 145 | }) 146 | .delete(function(req, res) { 147 | // Firebase DELETE user 148 | var uid = req.params.uid; 149 | 150 | usersRef.child(uid).remove(function(err) { 151 | if (err) { 152 | res.send(err); 153 | } else { 154 | res.json({message: "Success: User deleted."}); 155 | } 156 | }) 157 | }); 158 | 159 | // Register our routes - all routes prefixed with /api 160 | app.use('/api', apiRouter); 161 | 162 | 163 | //START THE SERVER =========================================================== 164 | app.listen(port); 165 | console.log('port: '+ port); 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | --------------------------------------------------------------------------------